廣度優先遍歷模板
題目彙總:
void bfs()}
}
在乙個 n × n 的方形網格中,每個單元格有兩種狀態:空(0)或者阻塞(1)。
一條從左上角到右下角、長度為 k 的暢通路徑,由滿足下述條件的單元格 c_1, c_2, …, c_k 組成:
相鄰單元格 c_i 和 c_ 在八個方向之一上連通(此時,c_i 和 c_ 不同且共享邊或角)
c_1 位於 (0, 0)(即,值為 grid[0][0])
c_k 位於 (n-1, n-1)(即,值為 grid[n-1][n-1])
如果 c_i 位於 (r, c),則 grid[r][c] 為空(即,grid[r][c] == 0)
返回這條從左上角到右下角的最短暢通路徑的長度。如果不存在這樣的路徑,返回 -1 。
:# 幾個點的考慮很強,已經訪問過的點,就不再訪問,就可以避免死迴圈;
#廣度優先遍歷,同一層次的點走過的距離其實是一樣的。所以不需要反覆重置已經走過的距離。如果誰滿足判定條件到達了,那麼他就是最快的。
#注意每一層每次進入佇列的都要清空。
defshortestpathbinarymatrix
(self, grid: list[list[
int]])
->
int:
n =len(grid)
if grid[0]
[0]==
1or grid[n -1]
[n -1]
==1:# 若起始點或終點堵塞,則不可能有這樣的路徑
return-1
if n ==1:
return
1 queue = deque(
) res =1[
0,0]
) i =
0 j =
0 record =
path =
1while queue:
path_old = path
path =
0 done =
0for m in
range
(path_old)
: i, j = queue.popleft(
) node_list =
[[i+
1,j+1]
,[i,j+1]
,[i,j-1]
,[i+
1, j]
,[i-
1, j]
,[i+
1, j-1]
,[i-
1, j+1]
,[i-
1, j-1]
]for a, b in node_list:
#一共是有八個方向可以選擇
#a, b = node
if a < n and b < n and a >=
0and b >=0:
if grid[a]
[b]==0:
[a, b]
) path +=
1 grid[a]
[b]=-1
# 注意字典的鍵不能是列表,可以是元組,數字、字串。
if a == n-
1and b == n-1:
return res +
1 done =
1if done ==1:
res +=
1else
:return
-1
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
二進位制矩陣中的特殊位置
leetcode演算法 演算法題 本題的思路是先統計每一行每一列的1的個數,然後遍歷這兩個陣列,當每一行每一列的1的個數均為一的時候,並且當前點為1,那麼說明當前點就是特殊位置,一定要注意判斷當前點位置也是1,否則,可能統計出來的數值就可能包含那種行的1,與列的1並非是同乙個1的情況而被統計進去。c...
二進位制中1的個數 二進位制中0的個數
1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...