AcWing 844. 走迷宫
原题链接
简单
作者:
Winkel
,
2020-11-02 22:42:02
,
所有人可见
,
阅读 273
#include<iostream>
#include<queue>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 110;
// d[][]:起点到其余每个点的距离矩阵
// g[][]:迷宫矩阵上的点
int d[N][N], g[N][N];
int n, m;
// 模拟队列,pair存x、y坐标
queue<pair<int,int>> q;
int bfs()
{
memset(d, -1 ,sizeof d); //距离都初始化为-1,表示都没走过
d[0][0] = 0; //起点到起点的距离为0
q.push({0,0});
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; //构成x轴向下、y轴向右二维坐标系中上、右、下、左四个方向
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]; //向某个方向走一步,得到新的坐标(x,y)
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1) //走完一步,若坐标有效(没走到迷宫外面)且到达点的位置为0(可以走),且该点还没走过
{
d[x][y] = d[t.first][t.second] + 1; //更新到达的点(x,y)到起点的距离,在原坐标(t.first,t.second)到起点的距离上+1
q.push({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();
return 0;
}