01基础知识
概述
有递归就有回溯,回溯隐藏在递归函数下面的部分,通常说回溯函数就是递归函数,两个是相辅相成的
回溯搜索就是纯暴力搜索
能解决的问题
- 组合问题:N个数里面按一定规则找出k个数的集合
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 棋盘问题:N皇后,解数独等等
如何理解
回溯法都可以抽象为一个树形结构(n叉树),
模板
void backtracking(参数){
if(终止条件) {
收集结果;
return;
}
//单层搜索
for(集合元素集){
处理节点;
递归函数;
回溯;
}
//for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历
return;
}