AcWing 844. 走迷宫
原题链接
简单
作者:
现代修士o_O
,
2021-04-27 20:52:50
,
所有人可见
,
阅读 281
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int n, m;
int g[N][N];//存储图
int d[N][N];//既表示每个位置的状态,有表示每个位置到起点的距离,最终状态表示每个位置距离初始位置的距离
PII q[N * N];//队列,初始化放入初始位置,类型是一个点(x,y)
int bfs()
{
//初始化
int hh = 0, tt = -1;
q[ ++ tt] = {0, 0};//初始位置放入队列
memset(d, -1, sizeof d);//-1表示未访问过,为什么不用零,因为零代表了初始位置距离它自己的距离。用零肯定也可以,后面输出距离的时候-1就ok了
d[0][0] = 0; //既表示这个点访问过,又表示它距离初始位置的距离
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
while (hh <= tt)
{
auto t = q[hh ++];//取出队头
for (int i = 0; i < 4; i ++ )
{
int x = t.x + dx[i], y = t.y + dy[i];
if (0 <= x && x < n && 0 <= y && y < m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.x][t.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 ++ )
scanf("%d", &g[i][j]);
cout << bfs() << endl;
return 0;
}