BFS解决最短路问题_迷宫中离入口最近的出口_C++
0. 最短路问题介绍
假设我们要从A点到G点,想要找到一条最短的路径,就是最短路问题。当然每个节点之间的权值可能不为1,但是今天我们只讨论边权为1的最短路问题,因为BFS算法只适用于边权为1的最短路问题。
1. 题目分析
leetcode链接:https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/description/
给你一个m x n
的迷宫矩阵maze
(下标从 0 开始),矩阵中有空格子(用'.'
表示)和墙(用'+'
表示)。同时给你迷宫的入口entrance
,用entrance = [entrancerow, entrancecol]
表示你一开始所在格子的行和列。
每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离entrance
最近的出口。出口的含义是maze
边界上的空格子。entrance
格子不算出口。
请你返回从entrance
到最近出口的最短路径的步数,如果不存在这样的路径,请你返回-1。
示例 1:
输入:maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2]
输出:1
解释:
- 总共有 3 个出口,分别位于 (1,0),(0,2) 和 (2,3) 。
- 一开始,你在入口格子 (1,2) 处。
- 你可以往左移动 2 步到达 (1,0) 。
- 你可以往上移动 1 步到达 (0,2) 。
- 从入口处没法到达 (2,3) 。
- 所以,最近的出口是 (0,2) ,距离为 1 步。
2. 算法分析
本题的思路和FooldFill
算法很类似,唯一不同的地方在于,要控制队列q一层一层的pop
。
3. 代码实现
class Solution {
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool vis[101][101];
int m, n;
public:
int nearestExit(vector<vector<char>>& maze, vector<int>& entrance)
{
m = maze.size(), n = maze[0].size();
queue<pair<int, int>> q;
q.push({entrance[0], entrance[1]});
vis[entrance[0]][entrance[1]] = true;
int step = 0;
while(q.size())
{
step++;
int sz = q.size();
for (int i = 0; i < sz; i++)
{
auto [a, b] = q.front();
q.pop();
for (int j = 0; j < 4; j++)
{
int x = a + dx[j], y = b + dy[j];
if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' && !vis[x][y])
{
// 判断是否已经到达出口
if (x == 0 || x == m -1 || y == 0 || y == n - 1) return step;
q.push({x, y});
vis[x][y] = true;
}
}
}
}
return -1;
}
};