鱼C论坛

 找回密码
 立即注册
查看: 1431|回复: 4

[已解决]关于BFS搜索求助,完全看不出问题

[复制链接]
发表于 2023-9-22 23:32:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rt.洛谷没人回答我,那我只好上这问了。

题目链接:https://www.luogu.com.cn/problem/P1746

问题:https://www.luogu.com.cn/discuss/689287

code:
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;

  5. typedef struct
  6. {
  7.         int x;
  8.         int y;
  9.         int step;
  10. }point;

  11. int main()
  12. {
  13.        
  14.         int n,mp[1145][1145],x1,y1,x2,y2,ch,bx[]={-1,0,0,1},by[]={0,1,-1,0};
  15.         bool road[1145][1145]={};
  16.         scanf("%d",&n);
  17.         getchar();
  18.         for(int i=0;i<=n;i++)
  19.         {
  20.                 for(int j=0;j<=n;j++)
  21.                 {
  22.                         mp[i][j]=-1;
  23.                 }
  24.         }
  25.         for(int i=1;i<=n;i++)
  26.         {
  27.                
  28.                 for(int j=1;j<=n;j++)
  29.                 {
  30.                         ch=getchar();
  31.                         if(ch=='0')road[i][j]=true;//okay.
  32.             //putchar(ch);
  33.                 }
  34.                 getchar();
  35.         //putchar('\n');
  36.         }
  37.         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  38.         queue<point> q;
  39.         q.push((point){x1,y1,0});
  40.         while(!(q.empty()))
  41.         {
  42.                 for(int i=0;i<4;i++)
  43.                 {
  44.                         if(road[q.front().x+bx[i]][q.front().y+by[i]] and mp[q.front().x+bx[i]][q.front().y+by[i]]==-1)
  45.                         {
  46.                                 //putchar('-');
  47.                                 mp[q.front().x+bx[i]][q.front().y+by[i]]=q.front().step+1;
  48.                 //printf("++%d %d++",q.front().x,q.front().y);
  49.                                 q.push((point){q.front().x+bx[i],q.front().y+by[i],q.front().step+1});
  50.                         }
  51.                 }
  52.                 q.pop();
  53.         }
  54.         printf("%d\n",mp[x2][y2]);
  55.        
  56. }
复制代码
最佳答案
2023-9-23 11:17:51
本帖最后由 柿子饼同学 于 2023-9-23 11:20 编辑

你代码风格有点...
我自己写了以下, 过了, 你自己看下呢
写代码不要写特别繁琐 , 不然看不出来的

  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. const int N = 1314;
  4. const int dx[] = {0, 1, 0, -1};
  5. const int dy[] = {1, 0, -1, 0};

  6. struct Step{
  7.     int x, y, step;
  8. };

  9. bitset<N> mp[N];  // 地图
  10. bitset<N> vis[N];

  11. int n, X1, X2, Y1, Y2;
  12. char ch;
  13. queue<Step> q;

  14. bool check(int x, int y){
  15.     return (x > 0 && x <= n && y > 0 && y <= n && !mp[x][y] && !vis[x][y]);
  16. }

  17. int bfs(){
  18.     q.push({X1, Y1, 0});
  19.     vis[X1][Y1] = 1;

  20.     while(!q.empty()){
  21.         auto cur = q.front();
  22.         q.pop();

  23.         if(cur.x == X2 && cur.y == Y2){
  24.             return cur.step;
  25.         }

  26.         for(int i = 0; i < 4; i++){
  27.             auto px = cur.x + dx[i];
  28.             auto py = cur.y + dy[i];

  29.             if(check(px, py)){
  30.                 vis[px][py] = 1;
  31.                 q.push({px, py, cur.step + 1});
  32.             }
  33.         }
  34.     }
  35.     return -1;
  36. }

  37. int main(){
  38.     ios::sync_with_stdio(0);
  39.     cin.tie(0);

  40.     cin >> n;
  41.     for(int i = 1; i <= n; i++){
  42.         for(int j = 1; j <= n; j++){
  43.             cin >> ch;
  44.             if(ch == '1') mp[i][j] = 1;
  45.         }
  46.     }
  47.     cin >> X1 >> Y1 >> X2 >> Y2;

  48.     cout << bfs();

  49.     return 0;
  50. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-22 23:32:48 | 显示全部楼层
这段代码实现的是一个BFS搜索算法,用于在一个n x n的01矩阵中,求从(x1, y1)到(x2, y2)的最短路径长度。

代码中使用了一个结构体point,用于存储每个点的坐标和步数。在搜索过程中,从队首取出一个点,遍历它的四个相邻点,如果该相邻点是通路且没有被搜索过,则将该点加入队列,并更新该点的步数。

在代码中,mp数组用于存储每个点到起点的最短路径长度,初始值为-1,表示该点没有被搜索过。road数组用于存储01矩阵中每个点是否为通路,初始值为false,表示该点不是通路。

代码实现上看起来没有问题,但是可能存在以下几个问题:

1. 代码中没有对输入数据进行有效性检查,如输入的n是否合法,起点和终点是否在矩阵范围内等。

2. 在读入01矩阵时,代码中使用了getchar()函数,但是没有判断输入是否合法,可能会导致程序出错。

3. 在搜索过程中,如果起点和终点不连通,则mp数组中终点的值仍为-1,需要在输出结果前判断终点是否被搜索过。

建议在代码中添加有效性检查和错误处理,以及在输出结果前判断终点是否被搜索过。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 09:29:26 | 显示全部楼层
一个内存溢出了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 11:17:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2023-9-23 11:20 编辑

你代码风格有点...
我自己写了以下, 过了, 你自己看下呢
写代码不要写特别繁琐 , 不然看不出来的

  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. const int N = 1314;
  4. const int dx[] = {0, 1, 0, -1};
  5. const int dy[] = {1, 0, -1, 0};

  6. struct Step{
  7.     int x, y, step;
  8. };

  9. bitset<N> mp[N];  // 地图
  10. bitset<N> vis[N];

  11. int n, X1, X2, Y1, Y2;
  12. char ch;
  13. queue<Step> q;

  14. bool check(int x, int y){
  15.     return (x > 0 && x <= n && y > 0 && y <= n && !mp[x][y] && !vis[x][y]);
  16. }

  17. int bfs(){
  18.     q.push({X1, Y1, 0});
  19.     vis[X1][Y1] = 1;

  20.     while(!q.empty()){
  21.         auto cur = q.front();
  22.         q.pop();

  23.         if(cur.x == X2 && cur.y == Y2){
  24.             return cur.step;
  25.         }

  26.         for(int i = 0; i < 4; i++){
  27.             auto px = cur.x + dx[i];
  28.             auto py = cur.y + dy[i];

  29.             if(check(px, py)){
  30.                 vis[px][py] = 1;
  31.                 q.push({px, py, cur.step + 1});
  32.             }
  33.         }
  34.     }
  35.     return -1;
  36. }

  37. int main(){
  38.     ios::sync_with_stdio(0);
  39.     cin.tie(0);

  40.     cin >> n;
  41.     for(int i = 1; i <= n; i++){
  42.         for(int j = 1; j <= n; j++){
  43.             cin >> ch;
  44.             if(ch == '1') mp[i][j] = 1;
  45.         }
  46.     }
  47.     cin >> X1 >> Y1 >> X2 >> Y2;

  48.     cout << bfs();

  49.     return 0;
  50. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-23 13:54:48 | 显示全部楼层
柿子饼同学 发表于 2023-9-23 11:17
你代码风格有点...
我自己写了以下, 过了, 你自己看下呢
写代码不要写特别繁琐 , 不然看不出来的

呵呵。原来我是字符操作的问题。
用 getchar() 吃换行符已经寄了无数次了
还是谢谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表