回溯模板:for循环里做dfs,回溯是特殊的dfs
res = []
def backtrack(选择列表, path):
if 满足结束条件:
res.append(path[:]) # 深度拷贝
return
for 选择 in 选择列表:
if 满足选择条件:
path.append(选择)
backtrack(选择列表, path)
path.pop()
dfs 和 bfs 区别:dfs使用递归,bfs使用 循环+队列
dfs是特殊的递归
图的 DFS与树的DFS最大的不同之处在于,遍历中可能遇到遍历过的结点。
回溯 < dfs < 递归
岛屿问题dfs模板:
def dfs(grid, i, j):
# 判断 base case
# 判断坐标 (i, j) 是否在网格中
if not (0 <= i < len(grid) and 0 <= j < len(grid[0])): return
# 如果这个格子不是岛屿,直接返回
if grid[i][j] != 1: return
grid[i][j] = 2; # 将格子标记为「已遍历过」