Featured image of post Nearest Exit From Entrance In Maze

Nearest Exit From Entrance In Maze

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

分析

  1. 初始化一个二维数组 dist,用来记录从入口到每个位置的步数,初始值为无穷大 INF
  2. 将入口位置的步数置为 0,并将其加入队列。
  3. 使用 BFS 依次扩展当前格子,尝试向上下左右 4 个方向移动:
    • 如果目标格子在边界上并且是出口,返回步数。
    • 如果目标格子可达(空格子,未访问过),更新步数并加入队列
  4. 如果队列为空,说明无法找到出口,返回 -1

时间复杂度

  • BFS 遍历迷宫每个空格子一次,每个格子最多处理 4 个方向

总时间复杂度为 O(n * m),其中 nm 分别为迷宫的行数和列数

空间复杂度

  • 需要存储距离矩阵 distBFS 的队列,均为 O(n * m)

总空间复杂度为 O(n * m)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution
{
public:
    int nearestExit(vector<vector<char>>& maze, vector<int>& entrance)
    {
      int n = maze.size(), m = maze[0].size();
      int INF = 0x3f3f3f3f; // 表示无穷大
      std::vector<std::vector<int>> dist(n, std::vector<int>(m, INF));
      dist[entrance[0]][entrance[1]] = 0; // 入口步数初始化为 0

      using PII = std::pair<int, int>;
      std::queue<PII> q;
      q.push({entrance[0], entrance[1]});

      // 定义四个移动方向
      int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
      while (q.size())
      {
        PII t = q.front();
        q.pop();
        int x = t.first, y = t.second;
        for (int i = 0; i < 4; ++ i) // 尝试上下左右四个方向
        {
          int a = x + dx[i], b = y + dy[i];
          // 检查新位置是否有效
          if (a >= 0 && a < n && b >= 0 && b < m && maze[a][b] == '.' && dist[a][b] > dist[x][y] + 1)
          {
            dist[a][b] = dist[x][y] + 1; // 更新步数
            // 如果新位置是出口(在边界上)
            if (a == 0 || a == n - 1 || b == 0 || b == m - 1)
              return dist[a][b];
            q.push({a, b}); // 加入队列
          }
        }
      }
      return -1; // 无法找到出口
    }
};
Built with Hugo
Theme Stack designed by Jimmy