走迷宫BFS的基本应用
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int g[N][N]; //存储地图
int d[N][N]; //标记搜索到的点的距离
int n,m; //地图的长宽
struct elem{
int x;
int y;
};
struct elem q[N*N]; //队列用于BFS操作
int bfs()
{
memset(d,-1,sizeof d); //初始化d
int hh=0,tt=0;
d[0][0]=0; //左上角第一个点开始搜索
q[hh]={0,0}; //将第一个点入队
int dx[4]={-1,0,1,0}; //方向盘用于对个方向进行尝试
int dy[4]={0,-1,0,1};
while(hh<=tt) //
{
struct elem j=q[hh++]; //获取队头元素 然后将其出队
for(int i=0;i<4;i++)
{
int x=j.x+dx[i];
int y=j.y+dy[i];
if(x>=0&&y>=0&&x<n&&y<m&&g[x][y]==0&&d[x][y]==-1) //点未出界 该点可走 且未走过
{
d[x][y]=d[j.x][j.y]+1;
q[++tt]={x,y};
}
}
}
return d[n-1][m-1];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
cout<<bfs()<<endl;
return 0;
}
为什么vector[HTML_REMOVED] q;就会报错
PII q[N * N];这样才可以啊,我不理解这个是为什么,原则上不都是可以的吗?
我想问下 不应该是 x < m ,y < n 吗 横坐标小于列数,纵坐标小于行数。。 比如n=5,m=3,那不就是横坐标是0-2,纵坐标是0-4吗
这里不能用正常的坐标系来理解, 大佬构造的坐标系是: y 是横轴且方向向右, x 是纵轴且方向向下.
如果用正常的坐标系来构造地图, 则地图位于第四象限 (y 为负数), 可是数组下标不能小于0, 难搞.
想问为啥 return d[n-1][m-1]是最小路径,不应该有很多条路吗
当第一次找到右下角离起点的距离的时候,就跳出循环了返回这个距离了
感觉应该是第一次找到这个点的时候(即最短距离)这个点就被标记了 如果下次访问这个点就访问不到(所以不是找到了就跳出循环)
应该是你说的这样,最后一个目标点被标记,那么对应的距离也不可变了。但是程序还是会遍历所有点之后再结束。
👍很清晰
您好,请问typedef struct em{
int x;
int y;
}e;
e ab;
ab.x=1;
ab.y=2;
ab={1,2};
这两种表达方式的区别在哪,我分着写就不行
赋值和初始化是不一样的,
看这个链接
点个赞
想问一下,hh和tt代表什么?
表示队头 和 队尾