LeetCode 490. 迷宫(BFS/DFS)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 490. 迷宫(BFS/DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 BFS
- 2.2 DFS
1. 題目
由空地和墻組成的迷宮中有一個球。
球可以向上下左右四個方向滾動,但在遇到墻壁前不會停止滾動。
當球停下時,可以選擇下一個方向。
給定球的起始位置,目的地和迷宮,判斷球能否在目的地停下。
迷宮由一個0和1的二維數組表示。 1表示墻壁,0表示空地。
你可以假定迷宮的邊緣都是墻壁。
起始位置和目的地的坐標通過行號和列號給出。
示例 1:
示例 2:
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/the-maze
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:
LeetCode 505. 迷宮 II(BFS / Dijkstra 最短路徑)
- 注意中間路過的點不需要標記訪問,只要標記停下來的點即可
2.1 BFS
class Solution { public:bool hasPath(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) {int m = maze.size(), n = maze[0].size(), i, j, k, x, y;vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};queue<vector<int>> q;vector<vector<bool>> visited(m, vector<bool>(n,false));q.push(start);visited[start[0]][start[1]] = true;while(!q.empty()){i = q.front()[0];j = q.front()[1];q.pop();if(i==destination[0] && j==destination[1])return true;for(k = 0; k < 4; ++k){x = i;y = j;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];// visited[x][y] = true;//不能加這一句,一會下面進不了隊列}//x,y,下一個位置是墻壁,停在xyif(!visited[x][y]){q.push({x, y});visited[x][y] = true;}}}return false;} };88 ms 17.6 MB
2.2 DFS
class Solution {int m, n;vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};bool found = false; public:bool hasPath(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) {m = maze.size(), n = maze[0].size();vector<vector<bool>> visited(m, vector<bool>(n,false));visited[start[0]][start[1]] = true;dfs(maze,start,destination,visited);return found;}void dfs(vector<vector<int>>& maze, vector<int> start, vector<int>& destination, vector<vector<bool>> &visited){if(found) return;int i = start[0], j = start[1], x, y, k;if(i==destination[0] && j==destination[1]){found = true;return;}for(k = 0; k < 4; ++k){x = i;y = j;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];// visited[x][y] = true;//不能加這一句,一會下面進不了隊列}if(!visited[x][y]){visited[x][y] = true;dfs(maze,{x,y},destination,visited);}}} };76 ms 18 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 490. 迷宫(BFS/DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1474. 删除链表
- 下一篇: LeetCode 565. 数组嵌套