トップ 一覧 Farm 検索 ヘルプ RSS ログイン

04ab1.cppの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
#include <iostream.h>
#define N 7
int main(void)
{
	while(1){
		int n, m, p;
		int d[N][N][N];		// 盤面
		int top[N][N];	// 一番上の位置を保持しておく
		int turn=1;	// 1:black 2:white
		// 列の確認用の移動量
		//        平面縦横          平面斜め                                立体斜め
		int dx[26]={1,0,0, -1, 0, 0,  -1, 1, 1,-1,  0, 0, 0, 0, -1, 1, 1,-1,  -1,-1,  1, 1,  1, 1, -1, -1};
		int dy[26]={0,1,0,  0,-1, 0,  -1,-1, 1, 1, -1, 1, 1,-1,  0, 0, 0, 0,  -1,-1, -1,-1,  1, 1,  1,  1};
		int dz[26]={0,0,1,  0, 0,-1,   0, 0, 0, 0, -1,-1, 1, 1, -1,-1, 1, 1,  -1, 1, -1, 1, -1, 1, -1,  1};
		
		// n,m,p入力
		cin >> n >> m >> p;
		if(n+m+p==0) break;
		
		// 初期化
		for(int z=0; z<n; z++){
			for(int y=0; y<n; y++){
				for(int x=0; x<n; x++){
					d[x][y][z]=0;
				}
			}
		}
		for(int y=0; y<n; y++){
			for(int x=0; x<n; x++){
				top[x][y]=0;
			}
		}
		
		// 確認
		cout << n << " " << m << " " << p << " : ";
		
		// 勝負が付いたかどうかのフラグ
		bool flag=false;
		
		// p回読み込み
		for(int i=0; i<p; i++){
			int x, y;
			cin >> x >> y;
			
			// 盤に駒を置く
			d[x-1][y-1][top[x-1][y-1]]=turn;
			
			// 勝負がついてるときはやらない
			if(!flag){
				// 列ができたか判定
				// (1)同一平面 縦横 3方向 (向きを考えると6方向)
				// (2)同一平面 斜め 6方向 ( 〃 12方向)
				// (3)立体的に斜め  4方向 ( 〃 8方向)
				for(int j=0; j<26; j++){
					int ct=0; // 列のカウント用
					int xx=x-1, yy=y-1, zz=top[x-1][y-1]; // 現在の場所
					while(d[xx][yy][zz]==turn){
						xx+=dx[j];
						yy+=dy[j];
						zz+=dz[j];
						ct++;
						if(xx<0 || yy<0 || zz<0 || xx>=n || yy>=n || zz>=n) break;
					}
					if(ct>=m){
						flag=true;
						if(turn==1){
							cout << "Black " << i+1 << endl;
						}else{
							cout << "White " << i+1 << endl;
						}
						break;
					}
				}
			}
			// 駒をおいたのでおける場所を1つ上にする
			top[x-1][y-1]++;
			
			// 順番交替
			if(turn==1){
				turn=2;
			}else{
				turn=1;
			}
		}
		
		if(!flag) cout << "Draw" << endl;
		
		// 盤面確認
/*		cout << endl;
		for(int z=0; z<n; z++){
			for(int y=0; y<n; y++){
				for(int x=0; x<n; x++){
					cout << d[x][y][z] << " ";
				}
				cout << endl;
			}
			cout << endl;
		}
*/		
	}
}
 #include <iostream.h>
 #define N 7
 int main(void)
 {
 	while(1){
 		int n, m, p;
 		int d[N][N][N];		// 盤面
 		int top[N][N];	// 一番上の位置を保持しておく
 		int turn=1;	// 1:black 2:white
 		// 列の確認用の移動量
 		//        平面縦横          平面斜め                                立体斜め
 		int dx[26]={1,0,0, -1, 0, 0,  -1, 1, 1,-1,  0, 0, 0, 0, -1, 1, 1,-1,  -1,-1,  1, 1,  1, 1, -1, -1 };
 		int dy[26]={0,1,0,  0,-1, 0,  -1,-1, 1, 1, -1, 1, 1,-1,  0, 0, 0, 0,  -1,-1, -1,-1,  1, 1,  1,  1 };
 		int dz[26]={0,0,1,  0, 0,-1,   0, 0, 0, 0, -1,-1, 1, 1, -1,-1, 1, 1,  -1, 1, -1, 1, -1, 1, -1,  1 };
 		
 		// n,m,p入力
 		cin >> n >> m >> p;
 		if(n+m+p==0) break;
 		
 		// 初期化
 		for(int z=0; z<n; z++){
 			for(int y=0; y<n; y++){
 				for(int x=0; x<n; x++){
 					d[x][y][z]=0;
 				}
 			}
 		}
 		for(int y=0; y<n; y++){
 			for(int x=0; x<n; x++){
 				top[x][y]=0;
 			}
 		}
 		
 		// 確認
 		cout << n << " " << m << " " << p << " : ";
 		
 		// 勝負が付いたかどうかのフラグ
 		bool flag=false;
 		
 		// p回読み込み
 		for(int i=0; i<p; i++){
 			int x, y;
 			cin >> x >> y;
 			
 			// 盤に駒を置く
 			d[x-1][y-1][top[x-1][y-1]]=turn;
 			
 			// 勝負がついてるときはやらない
 			if(!flag){
 				// 列ができたか判定
 				// (1)同一平面 縦横 3方向 (向きを考えると6方向)
 				// (2)同一平面 斜め 6方向 ( 〃 12方向)
 				// (3)立体的に斜め  4方向 ( 〃 8方向)
 				for(int j=0; j<26; j++){
 					int ct=0; // 列のカウント用
 					int xx=x-1, yy=y-1, zz=top[x-1][y-1]; // 現在の場所
 					while(d[xx][yy][zz]==turn){
 						xx+=dx[j];
 						yy+=dy[j];
 						zz+=dz[j];
 						ct++;
 						if(xx<0 || yy<0 || zz<0 || xx>=n || yy>=n || zz>=n) break;
 					}
 					if(ct>=m){
 						flag=true;
 						if(turn==1){
 							cout << "Black " << i+1 << endl;
 						}else{
 							cout << "White " << i+1 << endl;
 						}
 						break;
 					}
 				}
 			}
 			// 駒をおいたのでおける場所を1つ上にする
 			top[x-1][y-1]++;
 			
 			// 順番交替
 			if(turn==1){
 				turn=2;
 			}else{
 				turn=1;
 			}
 		}
 		
 		if(!flag) cout << "Draw" << endl;
 		
 		// 盤面確認
 /*		cout << endl;
 		for(int z=0; z<n; z++){
 			for(int y=0; y<n; y++){
 				for(int x=0; x<n; x++){
 					cout << d[x][y][z] << " ";
 				}
 				cout << endl;
 			}
 			cout << endl;
 		}
 */		
 	}
 }