开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
1926. 迷宫中离入口最近的出口
给你一个 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
解释: 这个迷宫中没有出口。
class Solution {
public:
typedef pair<int, int> PII;
#define x first
#define y second
int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};
int nearestExit(vector<vector<char>>& m, vector<int>& e) {
queue<PII>que;
que.push({e[0], e[1]});
int cnt = 0;
int nn = m.size(), mm = m[0].size();
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
auto it = que.front();
if (it.x == 0 || it.x == nn - 1 || it.y == 0 || it.y == mm - 1 &&(it.x != e[0] && it.y != e[1])) return cnt;
for (int i = 0; i < 4; i++) {
int xx = it.x + dx[i], yy = it.y + dy[i];
if (xx >= 0 && yy >= 0 && xx < nn && yy < mm && m[xx][yy] == '.') {
m[xx][yy] = '+';
que.push({xx, yy});
}
}
}
cnt++;
}
return -1;
}
};