回溯算法

Posted by lily on April 7, 2023

回溯的本质是穷举

  1. 把要穷举的问题抽象为树形结构
    1. 横向遍历(遍历遍及一维数组内所有数据)
    2. 纵向遍历(纵向深度由递归深度控制)
  2. 穷举模板
  3. 枚举剪枝
    1. 数据的共享和重复使用
    2. “树枝剪枝”
    3. “树层剪枝”
  4. 组合问题(有无重复数据)、分割问题(按顺序分割)

image.png

回溯函数模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }
    for (选择本层集合中元素树中节点孩子的数量就是集合的大小) {
        处理节点;
        backtracking(路径选择列表); // 递归
        回溯撤销处理结果
    }
}

棋盘问题

  1. 模拟棋盘生成一个二维列表,方便定位棋盘的坐标,x–y
  2. 最后得出结果时二维列表中的一维列表再转换为其它对应的格式存储