#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int g[N][N];//存储迷宫
int d[N][N];//存储该点到g[0][0]的距离
pair<int,int> q[N * N];//存储队列,队列中每个节点有横纵坐标
int n,m;
int bfs()
{
//初始化到起始点距离为-1
memset(d,-1,sizeof d);
d[0][0] = 0;//从第一个点开始走
//自己模拟队列
int hh = 0,tt = 0;//队头队尾
q[0] = {0,0};//队列第一个为起始点
//从该点往上右下左四个方向走
int dx[4] ={-1,0,1,0},dy[4] = {0,1,0,-1};
while(hh <= tt)//队列存在
{
auto t = q[hh ++];//取出队头
for(int i = 0;i < 4; i ++)
{
int x = t.first + dx[i],y = t.second + dy[i];
//下一个走到的点合法且是第一次走且能够走通
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.first][t.second] + 1;//上一个点到起始点的距离 + 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;
}
844. 走迷宫
最新推荐文章于 2024-09-02 16:35:28 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)