「已注销」 2023-04-04 22:02 采纳率: 90.2%
浏览 27
已结题

C++BFS死循环问题

洛谷原题:https://www.luogu.com.cn/problem/P1443
第一次写BFS,不知道为啥会死循环
我的代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

int n,m,x,y;
int map[405][405]={-1};
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={1,-1,2,-2,2,-2,1,-1};


struct node{
    int x,y,step;
}now,nextt;

void bfs(int x,int y){
    queue<node>q;
    map[x][y]=0;
    now.x=x;now.y=y;now.step=0;
    q.push(now);//初始化
    while(!q.empty()){
        now=q.front();q.pop();
        for(int i=0;i<8;i++){//遍历X个方向 
            int xx=now.x+dx[i];
            int yy=now.y+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]==-1) {
                nextt.x=xx;nextt.y=yy;nextt.step=now.step+1;
                map[xx][yy]=nextt.step;
                return;
                q.push(nextt);
            }
        }
    } 
}

int main(){
    cin>>n>>m>>x>>y;
    bfs(x,y);
    for(int i=1;i<=n;i++)for(int j=1;i<=m;j++)printf("%5d",map[i][j]);
    return 0;
}

  • 写回答

2条回答 默认 最新

  • _L.Y.H._ 2023-04-04 22:10
    关注

    你这个代码问题挺大(抱歉
    1.死循环:这是输出的问题
    应该为

      for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                printf("%5d",map[i][j]);
            }
            printf("\n");
        }
    

    2.bfs:
    问题很大。
    建议看一下这篇文章:https://blog.csdn.net/aliyonghang/article/details/128724989?spm=1001.2014.3001.5502

    最后
    给你浅浅修改了一下,可以通过~

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
     
    int n,m,x,y;
    int map[405][405];
    int dx[]={-2,-2,-1,-1,1,1,2,2};
    int dy[]={1,-1,2,-2,2,-2,1,-1};
     
     
    struct node{
        int x,y,step;
    }now,nextt;
     
    void bfs(int x,int y){
        queue<node>q;
        map[x][y]=0;
        now.x=x;now.y=y;now.step=0;
        q.push(now);//初始化
        while(!q.empty())
        {
            for(int i=0;i<8;i++)
            {//遍历X个方向 
                now=q.front();
                int xx=now.x+dx[i];
                int yy=now.y+dy[i];
                if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]==-1)
                {
                    nextt.x=xx;
                    nextt.y=yy;
                    nextt.step=now.step+1;
                    map[xx][yy]=nextt.step;
                 //   return;
                    q.push(nextt);
                }
            }
            q.pop();
        } 
    }
     
    int main(){
        cin>>n>>m>>x>>y;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                map[i][j]=-1;
            }
        }
        bfs(x,y);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                printf("%5d",map[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    

    还不懂的话问我,有时间一定会解答

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 创建了问题 4月4日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加