给你一个
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:
输入:maze = [["+","+","+"],[".",".","."],["+","+","+"]], entrance = [1,0] 输出:2 解释:迷宫中只有 1 个出口,在 (1,2) 处。 (1,0) 不算出口,因为它是入口格子。 初始时,你在入口与格子 (1,0) 处。 - 你可以往右移动 2 步到达 (1,2) 处。 所以,最近的出口为 (1,2) ,距离为 2 步。示例 3:
输入:maze = [[".","+"]], entrance = [0,0] 输出:-1 解释:这个迷宫中没有出口。
使用bfs思想解决这道题,使用一个book标记数组访问之前遍历过的坐标,
1、在元素入队列的时候进行判断和处理,最开始的入口坐标不作判断,只有对后续进行移动后的坐标进行判断处理
2、每层将所有一步能访问到的节点尽可能全部放入队列中,到最后第一次访问到边界条件时,进行结果的返回。
class Solution {
public:
int res = 0;
bool book[101][101] = {false};
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
int m = maze.size(), n = maze[0].size();
queue<pair<int, int>> q;
q.push({entrance[0], entrance[1]});
book[entrance[0]][entrance[1]] = true;
while(!q.empty())
{
int size = q.size();
res++;
while(size--)
{
auto [a, b] = q.front();
q.pop();
for(int k = 0; k < 4; k++)
{
int x = a + dx[k];
int y = b + dy[k];
if(x >= 0 && y >= 0 && x < m && y < n && maze[x][y] == '.' && !book[x][y])
{
if(x == 0 || x == m-1 || y == 0 || y == n-1)
return res;
q.push({x, y});
book[x][y] = true;
}
// else if(x == 0 || x == m-1 || y == 0 || y == n-1 && )
// return res;
// else if(x == 0 || x == m-1)
// if(y >= 0 && y < n && x != pre_x && y != pre_y)
// return res;
// else if(y == 0 || y == n-1)
// if(x >= 0 && x < m && x != pre_x && y != pre_y)
// return res;
}
}
}
return -1;
}
};