- BFS方法:借用一个队列 queue,实现BFS。
判断队列首部节点 (i, j) 是否未越界且为 1:
class Solution:
def solve(self , grid ):
# write code here
def BFS(grid,i,j):
queue = [[i,j]]
while queue:#直到队列为空,搜索结束。
#循环pop 队列首节点,直到整个队列为空,此时已经遍历完此岛屿。
[i,j] = queue.pop(0)
# 如果一个位置为 1,则将其加入队列,开始进行广度优先搜索。
if 0 <= i <len(grid) and 0 <= j <len(grid[0]) and grid[i][j] == '1':
#在广度优先搜索的过程中,每个搜索到的 11 都会被重新标记为 0。
grid[i][j] = '0'
#(删除岛屿节点),并将此节点上下左右节点 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 加入队列; 若不是则跳过此节点;
queue += [[i - 1,j] , [i + 1, j],[i,j - 1],[i, j + 1]]
count = 0
#为了求出岛屿的数量,我们可以扫描整个二维网格。
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '0':continue
BFS(grid, i, j)
count += 1
return count2、DFS解决:
每走过一个陆地格子,就把格子的值改为 2,这样当我们遇到 2 的时候,就知道这是遍历过的格子了。
0 —— 海洋格子
1 —— 陆地格子(未遍历过)
2 —— 陆地格子(已遍历过)
如果遍历过的陆地取0,这样我们就无法区分「海洋格子」和「已遍历过的陆地格子」了。如果题目更复杂一点,这很容易出 bug。
class Solution:
def solve(self , grid ):
# write code here
def dfs(grid, i, j):
#判断 base case
#如果这个格子不是岛屿,直接返回
if not 0 <= i < len(grid) or not 0 <= j < len(grid[0]) or grid[i][j] != '1': return
grid[i][j] = '2'
#访问上、下、左、右四个相邻结点
dfs(grid, i + 1, j)
dfs(grid, i, j + 1)
dfs(grid, i - 1, j)
dfs(grid, i, j - 1)
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
#判断坐标 (i, j) 是否在
if grid[i][j] == '1':
dfs(grid, i, j)
count += 1
return count
京公网安备 11010502036488号