迷宫中离入口最近的出口 BFS

156 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

1926. 迷宫中离入口最近的出口

难度163830第 56 场双周赛Q2

给你一个 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;
    }
};