做这道题的时候犯了三个错误,一道不难的题结果wa了很多次才A掉。
一、将ans数组的初值设为0,但是在输出的时候如果ans[i][j]为0,就输出‘".",这个很二。
二、每次搜索一个点的时候,应该对它周围八个点进行检查,我还是习惯性的检查了四个点。
三、忘了在输出"it is a beiju!"后面双换行,这个错误贡献了很多个PE。
思路很直白,对于搜到的每一个点检查周围是否有地雷,如果有的话,记录地雷的数量,并且不对当前的点进行搜索,否则对当前点开始搜索。
#include<stdio.h>
#include<string.h>
#define N 105
int mark[N][N],vis[N][N],ans[N][N];
int dir[8][2]={{1,0},{0,1},{-1,0},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
int n,x,y;
char s[N];
struct node
{
int x,y;
}q[N*N];
int fun(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=n) return 1;
return 0;
}
int judge(int x,int y)
{
int sum=0;
if(fun(x-1,y-1)&&mark[x-1][y-1]==-1) sum++;
if(fun(x-1,y)&&mark[x-1][y]==-1) sum++;
if(fun(x-1,y+1)&&mark[x-1][y+1]==-1) sum++;
if(fun(x,y-1)&&mark[x][y-1]==-1) sum++;
if(fun(x,y+1)&&mark[x][y+1]==-1) sum++;
if(fun(x+1,y-1)&&mark[x+1][y-1]==-1) sum++;
if(fun(x+1,y)&&mark[x+1][y]==-1) sum++;
if(fun(x+1,y+1)&&mark[x+1][y+1]==-1) sum++;
return sum;
}
void BFS()
{
node cur,next;
int head,tail;
head=tail=0;
cur.x=x;cur.y=y;
vis[cur.x][cur.y]=1;
q[tail++]=cur;
while(head!=tail)
{
cur=q[head++];
ans[cur.x][cur.y]=judge(cur.x,cur.y);
if(ans[cur.x][cur.y]!=0) continue;
for(int i=0;i<8;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(fun(next.x,next.y)&&vis[next.x][next.y]==0)
{
vis[next.x][next.y]=1;
q[tail++]=next;
}
}
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
getchar();
for(int i=1;i<=n;i++)
{
gets(s+1);
for(int j=1;j<=n;j++)
{
if(s[j]=='O') mark[i][j]=0;
else if(s[j]=='X') mark[i][j]=-1;
}
}
scanf("%d%d",&x,&y);
x++;y++;
if(mark[x][y]==-1)
{
printf("it is a beiju!\n\n");
continue;
}
memset(vis,0,sizeof(vis));
memset(ans,-1,sizeof(ans));
BFS();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(ans[i][j]==-1) printf(".");
else printf("%d",ans[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
本文详细解析了一款扫雷游戏的实现算法,重点介绍了使用BFS遍历算法来揭示地图的过程。文章通过解决常见错误来指导读者理解核心逻辑,包括初始化数组、检查周围地雷数量及正确输出结果。
1671

被折叠的 条评论
为什么被折叠?



