题目
起点为‘S’,终点为‘E’,障碍物为‘#’,可走点为‘.’,求从起点到终点所经过的最短距离。(其实就是求最快走出迷宫的路径长度)
思路
以从起点开始用bfs,设一个距离二维数组存每个点到起点的距离,起点设为0,每遍历到一个点就将这个点的距离更新为上个点的距离加一,最后判断终点距离是否被更新过,若没被更新过,则说明走不到终点,否则距离数组相对应下的数值即为起点到终点的最短距离。
核心代码
代码块
int bfs(PII start)
{
memset(dist, -1, sizeof(dist));
dist[start.first][start.second] = 0;
queue<PII> q;
q.push(start);
int xx[] = { -1,0,1,0 }, yy[] = { 0,1,0,-1 };
while (!q.empty()) {
auto t = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
int dx = t.first + xx[i];
int dy = t.second + yy[i];
if (dx >= 0 && dx < n && dy >= 0 && dy < m && g[dx][dy] != '#' && dist[dx][dy] == -1) {
dist[dx][dy] = dist[t.first][t.second] + 1;
if (g[dx][dy] == 'E')
return dist[dx][dy];
q.push({ dx,dy });
}
}
}
return -1;
}