1926.Nearest Exit from Entrance in Maze === ###### tags: `Medium`,`BFS`,`Matrix`,`Array` [1926. Nearest Exit from Entrance in Maze](https://leetcode.com/problems/nearest-exit-from-entrance-in-maze/) ### 題目描述: 走迷宮,找最近的出口。 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<sub>row</sub>, entrance<sub>col</sub> ] 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. ### 範例: ![](https://i.imgur.com/LI5V4l2.jpg) ``` Input: maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]] entrance = [1,2] Output: 1 ``` ### 解答 #### Javascript ```javascript function nearestExit(maze, entrance) { const isInBounds = (x, y, xLength, yLength) => x < xLength && x >= 0 && y < yLength && y >= 0; const isExit = (x, y, xLength, yLength) => x === 0 || x === xLength - 1 || y === 0 || y === yLength - 1; const queue = [[entrance[0], entrance[1], 0]]; const visited = []; for (let i = 0; i < maze.length; i++) { visited[i] = []; for (let j = 0; j < maze[i].length; j++) { visited[i][j] = false; } } visited[entrance[0]][entrance[1]] = true; // BFS while (queue.length) { const [x, y, step] = queue.shift(); const neighbors = [ [x + 1, y], [x - 1, y], [x, y + 1], [x, y - 1], ]; for (const neighbor of neighbors) { if (!isInBounds(neighbor[0], neighbor[1], maze.length, maze[0].length)) continue; if (maze[neighbor[0]][neighbor[1]] === '.' && !visited[neighbor[0]][neighbor[1]]) { if (isExit(neighbor[0], neighbor[1], maze.length, maze[0].length)) return step + 1; queue.push([neighbor[0], neighbor[1], step + 1]); } visited[neighbor[0]][neighbor[1]] = true; } } return -1; } ``` > [name=Marsgoat] [time= Nov 21, 2022] #### C++ ```cpp int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) { int res = 0; int row_n = maze.size(), col_n = maze[0].size(); vector<vector<int>> dirs{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; vector<vector<int>> thisLevel = {entrance}; maze[entrance[0]][entrance[1]] = '+'; while(!thisLevel.empty()) { vector<vector<int>> nextLevel; for(auto& v : thisLevel) { int row = v[0], col = v[1]; for(auto& d : dirs) { int next_row = row+d[0], next_col = col+d[1]; if(next_row >= row_n || next_row < 0 || next_col >= col_n || next_col < 0 || maze[next_row][next_col] == '+') continue; if(next_row == 0 || next_row == row_n-1 || next_col == 0 || next_col == col_n-1) return res+1; maze[next_row][next_col] = '+'; nextLevel.push_back({next_row, next_col}); } } res++; thisLevel=nextLevel; } return -1; } ``` > [name=XD] [time= Nov 21, 2022] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)