hdu 3316 Mine sweeping(BFS)

本文详细解析了一款扫雷游戏的实现算法,重点介绍了使用BFS遍历算法来揭示地图的过程。文章通过解决常见错误来指导读者理解核心逻辑,包括初始化数组、检查周围地雷数量及正确输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做这道题的时候犯了三个错误,一道不难的题结果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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值