​Ancient Go​

​HDU - 5546 ​

题意很简单,读入时用 scanf 的我,因为 getchar ( ) 就垫底了。QAQ。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>


using namespace std;

int a[200][200];
int vis[200][200];

int n = 9;

struct node
{
int x, y;
} l,w;

int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};

void bfs(int x, int y)
{
memset(vis,0,sizeof(vis));
queue<node>q;
l.x = x;
l.y = y;
vis[x][y] = 1;
q.push(l);
while(!q.empty())
{
w = q.front();
q.pop();
for(int i = 0 ; i < 4; i ++)
{
int tx = dx[i] + w.x;
int ty = dy[i] + w.y;
if(tx >= 0 && tx < 9 && ty >= 0 && ty < 9 && vis[tx][ty] == 0 && a[tx][ty] != 'o')
{
if(a[tx][ty] == 'x')
{
vis[tx][ty] = 1;
l.x = tx;
l.y = ty;
q.push(l);
}
else if(a[tx][ty] == '.')
{
return ;
}
}
}
}
for( int i= 0; i < 9; i++)
{
for(int j = 0; j < 9; j ++)
{
if(a[i][j]== 'x' && vis[i][j] == 1)
a[i][j] = '.';
}
}

}

int bfs1(int x,int y)
{
queue<node>q;
memset(vis,0,sizeof(vis));
w.x = x;
w.y = y;
vis[x][y] = 1;
int num = 0;
q.push(w);
while(!q.empty())
{
w = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int tx = w.x + dx[i];
int ty = w.y + dy[i];
if(tx >= 0 && tx < 9 && ty >= 0 && ty < 9 &&vis[tx][ty] == 0 &&a[tx][ty] != 'x' )
{
if(a[tx][ty]=='o')
{
l.x = tx;
l.y = ty;
q.push(l);
vis[tx][ty] = 1;
}
else
{
num ++;
vis[tx][ty] = 1;

}
}
if(num > 1) return 0;
}
}
return 1;
}
int main()
{
int t,Case = 0;
scanf("%d", &t);
while(t--)
{
getchar();
memset(a,0,sizeof(a));
for(int i = 0; i < 9; i ++)
{
getchar();
for(int j = 0; j < 9; j ++)
{
scanf("%c", &a[i][j]);
}
}
for(int i = 0; i <9; i ++)
{
for(int j = 0; j < 9; j ++)
{
if(a[i][j] == 'x')
{
bfs(i,j);
}
}
}
int f = 0;
for(int i = 0; i < 9; i ++)
{
for(int j = 0; j < 9; j ++)
{
if(a[i][j] == 'o')
{
f = bfs1(i,j);
if(f)
{
printf("Case #%d: Can kill in one move!!!\n",++ Case);
break;
}
}
}
if(f) break;
}
if(!f)
printf("Case #%d: Can not kill in one move!!!\n",++Case);
}
return 0;
}