鱼C论坛

 找回密码
 立即注册
查看: 359|回复: 2

bfs问题

[复制链接]
发表于 2023-11-29 21:30:34 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. // #define x first;
  4. // #define y second;
  5. const int N=1005;
  6. char g[N][N];
  7. int st[N][N];
  8. typedef pair<int,int> p;

  9. // 人所能到的地方,火焰一定可以到,用的bfs,还需要学一下
  10. int dx[]={0,-1,0,1},dy[]={-1,0,1,0}; //上左下右
  11. int main()
  12. {
  13.     int n,m,x,y;
  14.     cin>>n>>m;
  15.     for(int i=1;i<=n;i++)
  16.     {
  17.         for(int j=1;j<=m;j++)
  18.         {
  19.             cin>>g[i][j];   //a[i][j]=getchar();
  20.         }
  21.         //getchar() 也可以这么去读
  22.     }
  23.    
  24.     for(int i=1;i<=n;i++)
  25.     {
  26.         for(int j=1;j<=m;j++)
  27.         {
  28.              if(g[i][j]='@')
  29.              {
  30.                  x=i,y=j;
  31.              }
  32.         }
  33.         
  34.     }
  35.     int ans=0;
  36.     queue<p> q;
  37.     q.push({x,y});
  38.     st[x][y]=1;
  39.     while(q.size())
  40.     {
  41.         auto u=q.front();
  42.         q.pop();
  43.         x=u.first,y=u.second;
  44.         for(int i=0;i<4;i++)
  45.         {
  46.             int a=x+dx[i],b=dy[i]+y;
  47.             if(a<=n&&a>=1&&b<=n&&b>=1&&g[a][b]!='#'&&!st[a][b])
  48.             {
  49.                 if(g[a][b]=='!')ans++;
  50.                  st[a][b]=1;
  51.                 q.push({a,b});
  52.                
  53.             }

  54.         }
  55.         
  56.     }
  57.     cout<<ans<<endl;
  58.    
  59.    // 使用bfs,宽搜,感觉一般用队列去写
  60.    
  61.    
  62. }
复制代码

为什么输出的还是0,不知道哪里错了,不是以及ans++了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-29 21:30:58 | 显示全部楼层
这段代码似乎存在一些问题,我认为有几个地方需要进行修改和完善。

首先,在使用`pair`类型时,需要包含`<utility>`头文件。所以请在代码开头添加这行代码:`#include <utility>`

其次,在定义数组`dx`和`dy`时,需要使用大括号`{}`而不是小括号`()`. 所以请将这两行代码修改为:
  1. int dx[] = {0, -1, 0, 1}; // 上左下右
  2. int dy[] = {-1, 0, 1, 0};
复制代码

接着,在循环输入地图数据时,应该使用一个嵌套循环来逐行读取输入。所以请将下面的代码替换掉:
  1. for (int i=1;i<=n;i++)
  2. {
  3.     for (int j=1;j<=m;j++)
  4.     {
  5.         cin>>g;
  6.         // ...
  7.     }
  8. }
复制代码

最后,在内层循环中,可以使用`getchar()`来逐个读取字符,但是需要注意读取到的字符可能是回车符,所以在判断字符是否为'#'时,还需要加上一个判断条件。建议将以下这段代码替换为:
  1. for (int i=1;i<=n;i++)
  2. {
  3.     for (int j=1;j<=m;j++)
  4.     {
  5.         g = getchar();
  6.         while (g == '\n') // 跳过回车符
  7.         {
  8.             g = getchar();
  9.         }
  10.         if (g == '#')
  11.         {
  12.             // ...
  13.         }
  14.     }
  15. }
复制代码

以上是对代码的修改和完善,但是在原代码中,有一些变量没有被使用到,比如`x`和`y`。另外,你的问题应该是一个广度优先搜索(BFS)相关的问题,而目前的代码只是读取了地图数据,并未进行BFS操作。如果你能提供更多关于BFS的细节,我可以帮助你完成相应的代码实现。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-30 12:55:00 | 显示全部楼层
服了 , 你自己看看 29 行写的啥 ,  = 是赋值啊 , == 才是判断相等啊
你这样整个地图全是 @ 了
(调了好久...)
31 行后面找到了就建议写个 break , 这样更快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 15:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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