回溯法
代码随想录
回溯是递归的副产品
回溯算法可以抽象为树形结构,回溯法解决都是在集合中递归查找子集,集合的大小构成树的宽度,递归的深度构成树的深度。
回溯三部曲
- 回溯函数返回值及参数
- 回溯函数终止条件
- 回溯搜索的遍历过程
回溯算法能解决的问题
- 组合问题:N个数里面按一定规则找出k个数的集合
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 棋盘问题:N皇后,解数独等等
for循环横向遍历、递归纵向遍历,回溯不断调整结果集
//回溯法代码框架
// 回溯函数模板返回值及参数
void backtracing(参数)
// 终止条件
if(条件){
结果;
return;
// 回溯搜索的遍历过程
for(本层集合中的元素){
处理节点;
backtracing();
回溯;
}
}