http://acm.hdu.edu.cn/showproblem.php?pid=3316
分析:当遇到k=0时电脑会自动触发周围的8个方向点,8个方向中有地雷则不会点击该点,其余继续搜寻
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int NM=105;
char str[NM][NM];
int a[8][2]={-1,0,1,0,0,-1,0,1,-1,-1,1,-1,-1,1,1,1};
int vis[NM][NM],x,y,n;
struct MINE{
int x,y;
}mi[8];
void BFS()
{
queue<MINE>q1;
MINE t,p;
int i,ans,k;
t.x=x,t.y=y;
vis[t.x][t.y]=1;
q1.push(t);
memset(vis,0,sizeof(vis));
while(!q1.empty())
{
t=q1.front();q1.pop();
ans=k=0;
for(i=0;i<8;i++)
{
p.x=t.x+a[i][0],p.y=t.y+a[i][1];
if(p.x>=0&&p.x<n&&p.y>=0&&p.y<n)
{
if(str[p.x][p.y]=='X') ans++;
if(!vis[p.x][p.y])
{
mi[k].x=p.x,mi[k].y=p.y;
k++;
}
}
}
str[t.x][t.y]=ans+'0';
if(ans>0) continue;
for(i=0;i<k;i++)
{
q1.push(mi[i]);
vis[mi[i].x][mi[i].y]=1; //
}
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%s",str[i]);
scanf("%d%d",&x,&y);
if(str[x][y]=='X')
{
printf("it is a beiju!\n\n");
continue;
}
BFS();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(isdigit(str[i][j]))
printf("%c",str[i][j]);
else
printf(".");
}
printf("\n");
}
printf("\n");
}
return 0;
}