當找到初始「1」的時候,將其座標入隊,依據佇列的fifo特性,從佇列中取出座標,對其座標的上下左右元素進行訪問。
遞迴形式簡潔易懂:
class
solution
(object):
defnumislands
(self, grid)
->
int:
iflen
(grid)==0
:return
0else
: self.rows=
len(grid)
self.cols=
len(grid[0]
) numisland =
0# 初始化訪問標記陣列
visited=
for i in
range
(self.rows)
: rowstemp=
for j in
range
(self.cols)
: colstemp=
false
# 遍歷尋找陸地點
for i in
range
(self.rows)
:for j in
range
(self.cols)
:# 如果是陸地點且沒有訪問過就從這一點開始bfs廣度優先搜尋
if grid[i]
[j]==
'1'and visited[i]
[j]==
false
: numisland = numisland +
1# 島嶼計數加1
self.bfs(grid, visited, i, j)
return numisland
defbfs(self, grid:
list
, visited, i:
int, j:
int)
->
none
:# 網格的邊界條件,不能越界
if i >=
0and i < self.rows and j >=
0and j < self.cols:
if grid[i]
[j]==
'1'and visited[i]
[j]==
false
: visited[i]
[j]=
true
# 四個鄰接點遞迴bfs
self.bfs(grid, visited, i +
1, j)
self.bfs(grid, visited, i -
1, j)
self.bfs(grid, visited, i, j -1)
self.bfs(grid, visited, i, j +1)
else
:return
非遞迴形式需要用到佇列,如果臨近的元素為陸地「1」,則將其座標加入佇列中等待訪問,如果該元素已經被訪問,則跳過,重複這一過程,直到隊列為空,說明元素周圍再也沒有陸地,便可看作島嶼。
訪問過的「1」認為的變為「0」便於後續對未訪問的陸地進行查詢,島嶼的數量就等於隊列為空的遍歷次數。
class
solution
(object):
defnumislands
(self, grid):if
len(grid)==0
:return
0else
: self.rows =
len(grid)
self.cols =
len(grid[0]
) numisland =
0# 遍歷尋找陸地點
for i in
range
(self.rows)
:for j in
range
(self.cols)
:# 如果是陸地點且沒有訪問過就從這一點開始bfs廣度優先搜尋
if grid[i]
[j]==
'1':
numisland = numisland +
1# 島嶼計數加1
self.bfs(grid, i, j)
return numisland
defbfs(self, grid, i, j)
: self.rows =
len(grid)
self.cols =
len(grid[0]
)# 島嶼佇列
islandqueue = queue.queue(
) grid[i]
[j]=
'x'# 標記已搜尋路徑
islandqueue.put(i)
islandqueue.put(j)
while
not islandqueue.empty():
i = islandqueue.queue[0]
islandqueue.get(
) j = islandqueue.queue[0]
islandqueue.get(
)if i -
1>=
0and grid[i -1]
[j]==
'1':
# 上方擴充套件
grid[i -1]
[j]=
'x'# 標記
islandqueue.put(i -1)
islandqueue.put(j)
if i +
1< self.rows and grid[i +1]
[j]==
'1':
# 下方擴充套件
grid[i +1]
[j]=
'x'# 標記
islandqueue.put(i +1)
islandqueue.put(j)
if j -
1>=
0and grid[i]
[j -1]
=='1'
:# 左方擴充套件
grid[i]
[j -1]
='x'
# 標記
islandqueue.put(i)
islandqueue.put(j -1)
if j +
1< self.cols and grid[i]
[j +1]
=='1'
:# 右方擴充套件
grid[i]
[j +1]
='x'
# 標記
islandqueue.put(i)
islandqueue.put(j +
1)
島嶼數量(BFS廣度優先搜尋 佇列)
題目 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1 示例 2 輸入 11000 11000 0010...
探索佇列和棧 島嶼數量bfs廣度優先搜尋
給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1 示例 2 輸入 11000 11000 00100 0...
通過求島嶼的數量,學習深度優先搜尋和廣度優先搜尋
示例 2 輸入 11000 11000 00100 00011 輸出 3 廣度優先搜尋 也稱寬度優先搜尋,縮寫bfs,以下採用廣度來描述 是連通圖的一種遍歷演算法這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其...