- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
#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;
}
*/
}
}