bfs就是一层一层的去试探,其实可以这样理解,如果有几条线路都可以到终点得话,这几条线路都是同样的速度,如果某条路线最先到达了,其他线路就不让到达了,相同的速度,先到的就是距离最短。
每个位置在d数组也就是距离数组中能且只能被赋一次值,d数组中对应位置的值就是第一次找到这个元素所走的步数。既然是第一次找到这个点,肯定就是最短路径。
//bfs走迷宫
#include<iostream>
#include<queue>
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
queue<PII> q;
//d[][]数组表示每个点到达的步数是多少
int g[N][N], d[N][N], n, m;
int dx[4] = { -1, 1, 0, 0 }, dy[4] = { 0, 0, -1, 1 };
int bfs()
{
q.push({ 0, 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 (~x && x < n && ~y && y < m && !d[x][y] && !g[x][y])
{
d[x][y] = d[t.first][t.second] + 1;
//这个点放入队列,用来走到和它相邻的点。
q.push({ x, y });
}
}
}
return d[n - 1][m - 1];
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
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;
}
这里不需要将g[][]更新为1表示走过是因为d[][]数组已经充当这个角色了。