#include<bits/stdc++.h>
using namespace std;
const int N=110;
int g[N][N];//存地图
int n,m;
typedef pair<int,int> PII; //存每个坐标
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1}; //表示方向 上 右 下 左
int dist[N][N];//1.标记每个点是否走过 注意:每个点只遍历一次 2.记录图中某个点到起点的最短距离
int bfs(int a,int b)
{
if(a==n&&b==m) return 0; //起点即终点
memset(dist,-1,sizeof dist);
queue<PII> q;
q.push({a,b});
dist[a][b]=0;
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++) //分别枚举四个方向
{
int x=t.first+dx[i],y=t.second+dy[i];
if(g[x][y]==0&&x<=n&&y<=m&&x>0&&y>0&&dist[x][y]==-1)//判断能不能走过去
{
dist[x][y]=dist[t.first][t.second]+1; //能走过去就更新该点到起点的距离,并且把该点加到队列当中去
q.push({x,y});
}
if(x==n&&y==m) return dist[n][m];//如果能走过去并且到达了终点就直接结束bfs
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&g[i][j]);
printf("%d\n",bfs(1,1));
return 0;
}
BFS解决简单迷宫问题
最新推荐文章于 2024-04-15 16:53:55 发布