BFS简洁实现,遍历二维数组,遇到陆地(1),把与之相邻的陆地(1)全部访问完——得到一个岛屿,继续遍历
访问陆地全部相邻的陆地,可以用BFS也可以用DFS,只需要注意在访问到一块陆地之后,需要马上标记它(变成海洋(0)),避免重复访问。
import queue class Solution: def solve(self , grid: List[List[str]]) -> int: m, n = len(grid), len(grid[0]) if not m: # 为空返回0 return 0 dirs = [ lambda x, y:(x-1, y), # 上 lambda x, y:(x, y+1), # 右 lambda x, y:(x+1, y), # 下 lambda x, y:(x, y-1), # 左 ] count = 0 for i in range(m): for j in range(n): if grid[i][j] == '1': # 值为1,表示有岛屿出现 count += 1 q = queue.Queue() q.put((i, j)) grid[i][j] = '0' # 访问到了马上置零,避免重复访问 while not q.empty():# BFS,直到该岛屿被遍历完,跳出循环 x, y = q.get() for dir_ in dirs: nx, ny = dir_(x, y) # 四邻域内,把陆地纳入遍历队列 if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == '1': q.put((nx, ny)) grid[nx][ny] = '0' # 访问到了马上置零,避免重复访问 return count