廣度優先遍歷 二進位制矩陣中的最短路徑

2021-10-10 07:10:27 字數 2040 閱讀 9674

廣度優先遍歷模板

題目彙總:

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。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...