今日份題目:
給你一個 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 解釋:這個迷宮中沒有出口。
提示
-
maze.length == m
-
maze[i].length == n
-
1 <= m, n <= 100
-
maze[i][j]
要么是'.'
,要么是'+'
。 -
entrance.length == 2
-
0 <= entrancerow < m
-
0 <= entrancecol < n
-
entrance
一定是空格子。
題目思路
使用廣度優先遍歷,和之前的做法一樣,用一個隊列存放下個可以到達的位置信息,這里我就說一下重點要注意的地方和我踩的坑:
首先,需要一個額外的int型變量存放距離,不能用queue< <int,pair<int,int> > >,要用queue<tuple<int,int,int> >;
其次,將某點加入隊列后一定要將這個點設置為墻,我剛開始沒有注意到這點,就導致點上下上下一直循環,或者麻煩點用另一個數組標記到達過的點,否則會陷入死循環;
最后,我剛開始想用p.push_back({d+1{nx,ny}}),發現報錯,最后學到要用p.emplace(d+1,nx,ny),注意emplace括號里沒有大括號。
代碼
class Solution
{
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int n=maze.size();int m=maze[0].size();// 上下左右四個方向int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};queue<tuple<int,int,int> > p;// 入口加入隊列p.emplace(0,entrance[0],entrance[1]);// 入口修改為墻,這樣就不用額外考慮入口在邊界的情況了maze[entrance[0]][entrance[1]]='+';while(!p.empty()){// 獲取當前位置的坐標auto [d,x,y]=p.front();p.pop();// 遍歷四個方向的格子for(int i=0;i<4;i++){// 獲取四周的新坐標int nx=x+dx[i];int ny=y+dy[i];// 新坐標合法且不為墻if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]=='.'){if(nx==0||nx==n-1||ny==0||ny==m-1) //到達邊界了{// 新坐標為出口,返回距離作為答案return d+1;}// 修改為墻并加入隊列maze[nx][ny]='+'; //注意,不修改為墻會走回來p.emplace(d+1,nx,ny);}}}// 從入口到不了任意出口,返回-1return -1;}
};
提交結果
歡迎大家在評論區討論,如有不懂的部分,歡迎在評論區留言!
更新不易,寶子們點個贊支持下,謝謝!