トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF 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;
		}
*/		
	}
}