Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1926.html
1926. Nearest Exit from Entrance in Maze
Level
Medium
Description
You are given an m x n
matrix maze (0-indexed) with empty cells (represented as '.'
) and walls (represented as '+'
). You are also given the entrance
of the maze, where entrance = [entrance_row, entrance_col]
denotes the row and column of the cell you are initially standing at.
In one step, you can move one cell up, down, left, or right. You cannot step into a cell with a wall, and you cannot step outside the maze. Your goal is to find the nearest exit from the entrance
. An exit is defined as an empty cell that is at the border of the maze
. The entrance
does not count as an exit.
Return the number of steps in the shortest path from the entrance
to the nearest exit, or -1
if no such path exists.
Example 1:
Input: maze = [[”+”,”+”,”.”,”+”],[”.”,”.”,”.”,”+”],[”+”,”+”,”+”,”.”]], entrance = [1,2]
Output: 1
Explanation: There are 3 exits in this maze at [1,0], [0,2], and [2,3].
Initially, you are at the entrance cell [1,2].
- You can reach [1,0] by moving 2 steps left.
- You can reach [0,2] by moving 1 step up.
It is impossible to reach [2,3] from the entrance.
Thus, the nearest exit is [0,2], which is 1 step away.
Example 2:
Input: maze = [[”+”,”+”,”+”],[”.”,”.”,”.”],[”+”,”+”,”+”]], entrance = [1,0]
Output: 2
Explanation: There is 1 exit in this maze at [1,2].
[1,0] does not count as an exit since it is the entrance cell.
Initially, you are at the entrance cell [1,0].
- You can reach [1,2] by moving 2 steps right.
Thus, the nearest exit is [1,2], which is 2 steps away.
Example 3:
Input: maze = [[”.”,”+”]], entrance = [0,0]
Output: -1
Explanation: There are no exits in this maze.
Constraints:
maze.length == m
maze[i].length == n
1 <= m, n <= 100
maze[i][j]
is either'.'
or'+'
.entrance.length == 2
0 <= entrance_row < m
0 <= entrance_col < n
entrance
will always be an empty cell.
Solution
Do breadth-first search in maze
starting from entrance
. The cell entrance
is visited first and does not count as an exit. Once the first empty cell that is on the border is visited, return the number of steps.
-
class Solution { public int nearestExit(char[][] maze, int[] entrance) { int[][] directions = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int m = maze.length, n = maze[0].length; boolean[][] visited = new boolean[m][n]; visited[entrance[0]][entrance[1]] = true; Queue<int[]> queue = new LinkedList<int[]>(); queue.offer(entrance); int steps = 0; while (!queue.isEmpty()) { steps++; int size = queue.size(); for (int i = 0; i < size; i++) { int[] cell = queue.poll(); int row = cell[0], column = cell[1]; for (int[] direction : directions) { int newRow = row + direction[0], newColumn = column + direction[1]; if (newRow >= 0 && newRow < m && newColumn >= 0 && newColumn < n && !visited[newRow][newColumn] && maze[newRow][newColumn] == '.') { if (newRow == 0 || newRow == m - 1 || newColumn == 0 || newColumn == n - 1) return steps; visited[newRow][newColumn] = true; queue.offer(new int[]{newRow, newColumn}); } } } } return -1; } } ############ class Solution { public int nearestExit(char[][] maze, int[] entrance) { int m = maze.length; int n = maze[0].length; Deque<int[]> q = new ArrayDeque<>(); q.offer(entrance); maze[entrance[0]][entrance[1]] = '+'; int ans = 0; int[] dirs = {-1, 0, 1, 0, -1}; while (!q.isEmpty()) { ++ans; for (int k = q.size(); k > 0; --k) { int[] p = q.poll(); int i = p[0], j = p[1]; for (int l = 0; l < 4; ++l) { int x = i + dirs[l], y = j + dirs[l + 1]; if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.') { if (x == 0 || x == m - 1 || y == 0 || y == n - 1) { return ans; } q.offer(new int[] {x, y}); maze[x][y] = '+'; } } } } return -1; } }
-
// OJ: https://leetcode.com/problems/nearest-exit-from-entrance-in-maze/ // Time: O(MN) // Space: O(min(M, N)^2) class Solution { public: int nearestExit(vector<vector<char>>& A, vector<int>& E) { int dirs[4][2] = { {0,1},{0,-1},{-1,0},{1,0} }, step = 0, M = A.size(), N = A[0].size(); queue<pair<int, int>> q; A[E[0]][E[1]] = '+'; q.emplace(E[0], E[1]); while (q.size()) { int cnt = q.size(); while (cnt--) { auto [x, y] = q.front(); q.pop(); if ((x != E[0] || y != E[1]) && (x == 0 || x == M - 1 || y == 0 || y == N - 1)) return step; for (auto &[dx, dy] : dirs) { int a = x + dx, b = y + dy; if (a < 0 || b < 0 || a >= M || b >= N || A[a][b] == '+') continue; A[a][b] = '+'; q.emplace(a, b); } } ++step; } return -1; } };
-
class Solution: def nearestExit(self, maze: List[List[str]], entrance: List[int]) -> int: m, n = len(maze), len(maze[0]) i, j = entrance q = deque([(i, j)]) maze[i][j] = '+' ans = 0 while q: ans += 1 for _ in range(len(q)): i, j = q.popleft() for a, b in [[0, -1], [0, 1], [-1, 0], [1, 0]]: x, y = i + a, j + b if 0 <= x < m and 0 <= y < n and maze[x][y] == '.': if x == 0 or x == m - 1 or y == 0 or y == n - 1: return ans q.append((x, y)) maze[x][y] = '+' return -1 ############ # 1926. Nearest Exit from Entrance in Maze # https://leetcode.com/problems/nearest-exit-from-entrance-in-maze class Solution: def nearestExit(self, maze: List[List[str]], entrance: List[int]) -> int: rows, cols = len(maze), len(maze[0]) ox, oy = entrance if maze[ox][oy] == '+': return -1 queue = collections.deque([[ox, oy, 0]]) visited = set([(ox, oy)]) while queue: x, y, steps = queue.popleft() if steps > 0 and (x == 0 or y == 0 or x == rows - 1 or y == cols - 1): return steps for dx, dy in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): if 0 <= dx < rows and 0 <= dy < cols and (dx, dy) not in visited and maze[dx][dy] == '.': visited.add((dx, dy)) queue.append((dx, dy, steps + 1)) return -1
-
func nearestExit(maze [][]byte, entrance []int) int { m, n := len(maze), len(maze[0]) q := [][]int{entrance} maze[entrance[0]][entrance[1]] = '+' ans := 0 dirs := []int{-1, 0, 1, 0, -1} for len(q) > 0 { ans++ for k := len(q); k > 0; k-- { p := q[0] q = q[1:] for l := 0; l < 4; l++ { x, y := p[0]+dirs[l], p[1]+dirs[l+1] if x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.' { if x == 0 || x == m-1 || y == 0 || y == n-1 { return ans } q = append(q, []int{x, y}) maze[x][y] = '+' } } } } return -1 }