LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 BFS
- 2.2 Dijkstra 最短路徑
1. 題目
由空地和墻組成的迷宮中有一個球。
球可以向上下左右四個方向滾動,但在遇到墻壁前不會停止滾動。
當球停下時,可以選擇下一個方向。
給定球的起始位置,目的地和迷宮,找出讓球停在目的地的最短距離。
距離的定義是球從起始位置(不包括)到目的地(包括)經過的空地個數。
如果球無法停在目的地,返回 -1。
迷宮由一個0和1的二維數組表示。 1表示墻壁,0表示空地。
你可以假定迷宮的邊緣都是墻壁。
起始位置和目的地的坐標通過行號和列號給出。
示例 1:
示例 2:
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/the-maze-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:LeetCode 490. 迷宮(BFS/DFS)
2.1 BFS
class Solution { public:int shortestDistance(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) {int m = maze.size(), n = maze[0].size(), i, j, k, x, y, delta;vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};queue<vector<int>> q;vector<vector<int>> dis(m, vector<int>(n,INT_MAX));dis[start[0]][start[1]] = 0;q.push(start);while(!q.empty()){i = q.front()[0];j = q.front()[1];q.pop();for(k = 0; k < 4; ++k){x = i;y = j;delta = 0;while(x+dir[k][0]>=0 && x+dir[k][0]<m && y+dir[k][1]>=0 && y+dir[k][1]<n&& maze[x+dir[k][0]][y+dir[k][1]]==0){x += dir[k][0];y += dir[k][1];delta++;//走的步數增量}if(dis[i][j]+delta < dis[x][y])//該方向下一個位置為墻壁,停在xy{dis[x][y] = dis[i][j]+delta;q.push({x,y});}}}return dis[destination[0]][destination[1]]==INT_MAX ? -1 : dis[destination[0]][destination[1]];} };120 ms 19.7 MB
2.2 Dijkstra 最短路徑
- 采用優先隊列更新到某位置的最短距離
124 ms 18.3 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 846. 一手顺子(m
- 下一篇: LeetCode 1469. 寻找所有的