python展开代码def dfs(参数):
    # 终止条件(越界、已访问、不符合条件)
    if 终止条件:
        return
    
    # 处理当前节点(标记已访问、记录路径等)
    处理当前节点
    
    # 递归访问相邻节点(四个方向、子节点等)
    for 方向 in 所有可能的方向:
        dfs(新参数)  # 递归
    
    # 回溯(如果需要恢复状态,如全排列问题)
    # 例如:撤销访问标记、弹出当前节点等
题目描述:
给你一个由 '1'(陆地)和 '0'(水)组成的二维网格,请你计算网格中岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接形成。
示例:
输入:
展开代码[ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ]
输出:3
(i, j)。'0')或已访问过'1' 改为 '0')python展开代码def numIslands(grid):
    if not grid:
        return 0
    
    count = 0
    rows, cols = len(grid), len(grid[0])
    
    def dfs(i, j):
        # 终止条件:越界或当前是水
        if i < 0 or i >= rows or j < 0 or j >= cols or grid[i][j] == '0':
            return
        
        # 处理当前节点:标记为已访问(淹没陆地)
        grid[i][j] = '0'
        
        # 递归访问四个方向
        dfs(i-1, j)  # 上
        dfs(i+1, j)  # 下
        dfs(i, j-1)  # 左
        dfs(i, j+1)  # 右
    
    # 遍历整个网格
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == '1':
                dfs(i, j)
                count += 1  # 每次DFS后岛屿数量+1
    
    return count
如何避免重复访问:
通过将访问过的陆地 '1' 修改为 '0',确保每个岛屿只被计数一次。
DFS的方向选择:
本题需要检查上下左右四个方向,递归时会自动处理所有连通区域。
时间复杂度:
O(M×N),每个网格点最多被访问一次。
visited矩阵。掌握这个模板后,你可以快速解决大多数DFS问题!核心是明确递归函数的职责,处理好终止条件和状态标记。


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!