生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1391. 检查网格中是否存在有效路径(BFS)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 BFS
- 2.2 爆棧的DFS
- 2.3 不爆棧的DFS
1. 題目
給你一個(gè) m x n 的網(wǎng)格 grid。網(wǎng)格里的每個(gè)單元都代表一條街道。grid[i][j] 的街道可以是:
- 1 表示連接左單元格和右單元格的街道。
- 2 表示連接上單元格和下單元格的街道。
- 3 表示連接左單元格和下單元格的街道。
- 4 表示連接右單元格和下單元格的街道。
- 5 表示連接左單元格和上單元格的街道。
- 6 表示連接右單元格和上單元格的街道。
你最開(kāi)始從左上角的單元格 (0,0) 開(kāi)始出發(fā),網(wǎng)格中的「有效路徑」是指從左上方的單元格 (0,0) 開(kāi)始、一直到右下方的 (m-1,n-1) 結(jié)束的路徑。該路徑必須只沿著街道走。
注意:你 不能 變更街道。
如果網(wǎng)格中存在有效的路徑,則返回 true,否則返回 false 。
示例 1:
輸入:grid
= [[2,4,3],[6,5,2]]
輸出:
true
解釋:如圖所示,你可以從
(0, 0) 開(kāi)始,訪(fǎng)問(wèn)網(wǎng)格中的所有單元格并到達(dá)
(m
- 1, n
- 1) 。
示例 2:
輸入:grid
= [[1,2,1],[1,2,1]]
輸出:
false
解釋:如圖所示,單元格
(0, 0) 上的街道沒(méi)有與任何其他單元格上的街道相連,你只會(huì)停在
(0, 0) 處。示例
3:
輸入:grid
= [[1,1,2]]
輸出:
false
解釋:你會(huì)停在
(0, 1),而且無(wú)法到達(dá)
(0, 2) 。示例
4:
輸入:grid
= [[1,1,1,1,1,1,3]]
輸出:
true示例
5:
輸入:grid
= [[2],[2],[2],[2],[2],[2],[6]]
輸出:
true提示:
m
== grid
.length
n
== grid
[i
].length
1 <= m
, n
<= 300
1 <= grid
[i
][j
] <= 6
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/check-if-there-is-a-valid-path-in-a-grid
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
2.1 BFS
class Solution {vector
<vector
<int>> d
= {{0,1},{1,0},{-1,0},{0,-1}};vector
<vector
<vector
<int>>> dir
= {{},{d
[0],d
[3]},{d
[1],d
[2]},{d
[1],d
[3]},{d
[0],d
[1]},{d
[2],d
[3]},{d
[0],d
[2]}};int m
,n
;
public:bool hasValidPath(vector
<vector
<int>>& grid
) {m
= grid
.size(), n
= grid
[0].size();vector
<vector
<bool>> visited(m
, vector
<bool>(n
,false));visited
[0][0] = true;queue
<vector
<int>> q
;q
.push({0,0});int x
,y
,x0
,y0
,k
,dx
,dy
;while(!q
.empty()){x0
= q
.front()[0];y0
= q
.front()[1];if(x0
==m
-1 && y0
==n
-1)return true;q
.pop();for(k
= 0; k
< dir
[grid
[x0
][y0
]].size(); ++k
){ dx
= dir
[grid
[x0
][y0
]][k
][0];dy
= dir
[grid
[x0
][y0
]][k
][1];x
= x0
+dx
;y
= y0
+dy
;if(x
>=0 && x
<m
&& y
>=0 && y
<n
&& !visited
[x
][y
] && isok(grid
,dx
,dy
,x
,y
)){visited
[x
][y
] = true;q
.push({x
,y
});}}}return false;}bool isok(vector
<vector
<int>>& grid
, int &dx
, int &dy
, int &x
, int &y
){ if(dx
== 1 && dy
==0){if(grid
[x
][y
]==2 || grid
[x
][y
]==5 || grid
[x
][y
]==6)return true;}else if(dx
== 0 && dy
== 1){if(grid
[x
][y
]==1 || grid
[x
][y
]==3 || grid
[x
][y
]==5)return true;}else if(dx
== -1 && dy
== 0){if(grid
[x
][y
]==2 || grid
[x
][y
]==3 || grid
[x
][y
]==4)return true;}else if(dx
== 0 && dy
== -1){if(grid
[x
][y
]==1 || grid
[x
][y
]==4 || grid
[x
][y
]==6)return true;}return false;}
};
2.2 爆棧的DFS
- dfs 方法爆棧,代碼如下,請(qǐng)大佬幫忙看看什么原因
class Solution {vector
<vector
<int>> d
= {{0,1},{1,0},{-1,0},{0,-1}};vector
<vector
<vector
<int>>> dir
= {{},{d
[0],d
[3]},{d
[1],d
[2]},{d
[1],d
[3]},{d
[0],d
[1]},{d
[2],d
[3]},{d
[0],d
[2]}};bool found
= false;int m
,n
;
public:bool hasValidPath(vector
<vector
<int>>& grid
) {m
= grid
.size(), n
= grid
[0].size();vector
<vector
<bool>> visited(m
, vector
<bool>(n
,false));visited
[0][0] = true;dfs(grid
,0,0,visited
);return found
;}void dfs(vector
<vector
<int>>& grid
, int i
, int j
,vector
<vector
<bool>> &visited
){if(found
)return;if(i
==m
-1 && j
==n
-1){found
= true;return;}int x
, y
, k
, dx
, dy
;for(k
= 0; k
< dir
[grid
[i
][j
]].size(); ++k
){dx
= dir
[grid
[i
][j
]][k
][0];dy
= dir
[grid
[i
][j
]][k
][1];x
= i
+dx
;y
= j
+dy
;if(x
>=0 && x
<m
&& y
>=0 && y
<n
&& !visited
[x
][y
] && isok(grid
,dx
,dy
,x
,y
)){visited
[x
][y
] = true;dfs(grid
,x
,y
,visited
);visited
[x
][y
] = false;}}}bool isok(vector
<vector
<int>>& grid
, int &dx
, int &dy
, int &x
, int &y
){if(dx
== 1 && dy
==0){if(grid
[x
][y
]==2 || grid
[x
][y
]==5 || grid
[x
][y
]==6)return true;}else if(dx
== 0 && dy
== 1){if(grid
[x
][y
]==1 || grid
[x
][y
]==3 || grid
[x
][y
]==5)return true;}else if(dx
== -1 && dy
== 0){if(grid
[x
][y
]==2 || grid
[x
][y
]==3 || grid
[x
][y
]==4)return true;}else if(dx
== 0 && dy
== -1){if(grid
[x
][y
]==1 || grid
[x
][y
]==4 || grid
[x
][y
]==6)return true;}return false;}
};
2.3 不爆棧的DFS
- isok 函數(shù) 的 int 變量去掉 & 就不報(bào)錯(cuò)了,什么情況。。。
class Solution {vector
<vector
<int>> d
= {{0,1},{1,0},{-1,0},{0,-1}};vector
<vector
<vector
<int>>> dir
= {{},{d
[0],d
[3]},{d
[1],d
[2]},{d
[1],d
[3]},{d
[0],d
[1]},{d
[2],d
[3]},{d
[0],d
[2]}};bool found
= false;int m
,n
;
public:bool hasValidPath(vector
<vector
<int>>& grid
) {m
= grid
.size(), n
= grid
[0].size();vector
<vector
<bool>> visited(m
, vector
<bool>(n
,false));visited
[0][0] = true;dfs(grid
,0,0,visited
);return found
;}void dfs(vector
<vector
<int>>& grid
, int i
, int j
,vector
<vector
<bool>> &visited
){if(found
)return;if(i
==m
-1 && j
==n
-1){found
= true;return;}int x
, y
, k
, dx
, dy
;for(k
= 0; k
< dir
[grid
[i
][j
]].size(); ++k
){dx
= dir
[grid
[i
][j
]][k
][0];dy
= dir
[grid
[i
][j
]][k
][1];x
= i
+dx
;y
= j
+dy
;if(x
>=0 && x
<m
&& y
>=0 && y
<n
&& !visited
[x
][y
] && isok(grid
,dx
,dy
,x
,y
)){visited
[x
][y
] = true;dfs(grid
,x
,y
,visited
);visited
[x
][y
] = false;}}}bool isok(vector
<vector
<int>> &grid
, int dx
, int dy
, int x
, int y
){if(dx
== 1 && dy
==0){if(grid
[x
][y
]==2 || grid
[x
][y
]==5 || grid
[x
][y
]==6)return true;}else if(dx
== 0 && dy
== 1){if(grid
[x
][y
]==1 || grid
[x
][y
]==3 || grid
[x
][y
]==5)return true;}else if(dx
== -1 && dy
== 0){if(grid
[x
][y
]==2 || grid
[x
][y
]==3 || grid
[x
][y
]==4)return true;}else if(dx
== 0 && dy
== -1){if(grid
[x
][y
]==1 || grid
[x
][y
]==4 || grid
[x
][y
]==6)return true;}return false;}
};
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1391. 检查网格中是否存在有效路径(BFS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。