算法拾遗-回溯算法

算法拾遗-回溯算法

回溯算法与多叉树遍历十分类似。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 回溯算法框架
List<Value> result;
void backTracking(choices, path) {
	if (meet) { // 满足条件收集结果
        result.add(path);
        return;
    }
    for (choice : choices) { // 当前层可选择列表
        do; // 做出当前层的选择
        backTracking(choices, path); // 下一层
        undo;
    }
}

多叉树遍历框架

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 多叉树遍历框架 
void traverse(TreeNode node) {
    // base case
    if(node == null) {  
        return;
    }
    for (TreeNode child : node.children) {
        traverse(child);
    }
}

矩阵的dfs框架

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void dfs(int[][] grid, int r, int c) {
    // 判断 base case
    if (!inArea(grid, r, c)) {
        return;
    }
    // 如果这个格子不是岛屿,直接返回
    if (grid[r][c] != 1) {
        return;
    }
    grid[r][c] = 2; // 将格子标记为「已遍历过」
    
    // 访问上、下、左、右四个相邻结点 遍历过
    dfs(grid, r - 1, c);
    dfs(grid, r + 1, c);
    dfs(grid, r, c - 1);
    dfs(grid, r, c + 1);
}

// 判断坐标 (r, c) 是否在网格中
boolean inArea(int[][] grid, int r, int c) {
    return 0 <= r && r < grid.length 
        	&& 0 <= c && c < grid[0].length;
}
updatedupdated2024-08-252024-08-25