。。。。。。wa了无数次,原来多个空白连在一起只计一个。。。。。。。。
题意:扫雷,可以点开数字格,也可以点开空白格,但点开空白格时,他旁边的数字格和空白格(继续扩展点开)会自动点开,不能点雷,最后不能点的输。
每次搜出一个块的个数
如果是偶数则sg=2, 奇数sg=1.
单个数字 sg=1
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include <queue>
using namespace std;
#define N 1050
int map[N][N],n,m,k,vis[N][N];
int d[8][2]= {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
struct node
{
int x,y;
};
bool check(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
int bfs(int x,int y)
{
int num=1;
node a,b;
queue<node> q;
a.x=x;
a.y=y;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
vis[a.x][a.y]=1;
for(int i=0;i<8;i++)
{
b.x=a.x+d[i][0];
b.y=a.y+d[i][1];
if(check(b.x,b.y)&&!vis[b.x][b.y])
{
if(map[b.x][b.y]==0) q.push(b);
else num++;
vis[b.x][b.y]=1;
}
}
}
return num;
}
int main()
{
int i,t,j,T,x,y,xx,yy,k;
scanf("%d",&T);
vector<int> black;
int num;
for(t=1; t<=T; t++)
{
black.clear();
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&m,&k);
int res=0;
for(i=0; i<k; i++)
{
scanf("%d%d",&x,&y);
map[x][y]=-1;
vis[x][y]=1;
for(j=0; j<8; j++)
{
xx=x+d[j][0];
yy=y+d[j][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!=-1)
map[xx][yy]++;
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
num=0;
if(map[i][j]==0&&!vis[i][j])
{
num=bfs(i,j);
if(num%2) res^=1;
else res^=2;
}
}
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(map[i][j]>0 && !vis[i][j] )
res ^= 1;
printf("Case #%d: ",t);
if(res) puts("Xiemao");
else puts("Fanglaoshi");
}
return 0;
}