pythondef 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'
)pythondef 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 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!