回溯

回溯算法

一般是回溯的问题:

  • 组合
  • 分割
  • 子集
  • 排列
  • 棋盘问题
  • 其他

模板:

  1. 函数模板返回值和参数 返回值是void 参数一般不确定,可以先写逻辑,然后需要参数再填
  2. 终止条件 一般是到了叶子结点,也就是满足条件的一条答案,把这个答案存起来,并结束本层递归。 if(终止条件){ 存放结果; return; }
  3. 遍历过程 一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成树的深度。 for(选择:本层集合元素(树中节点孩子的数量就是集合的大小)){ 处理节点; backtracking(路径,选择列表)//递归 回溯,撤销处理结果 }

for循环可以理解是横向遍历,backtracking是纵向遍历。

分析完过程,整个框架如下:

void backtracking(参数){
  if(终止条件){
    存放结果;
    return;
  }

  for(选择:本层集合元素(树中节点孩子的数量就是集合的大小)){
    处理节点;
    backtracking(路径,选择列表);//递归
    回溯,撤销处理结果
  }
}

最后修改 December 25, 2024: 菜单更新 (a57fa7d)