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