模板
//通过递归代替循环嵌套
void backtracking()
{
if(终止条件)
{
存结果;
return;
}
for(遍历)
{
push
backtracking()//递归
pop//回溯
}
}
组合问题
- 从前向后取数据,所以需要在回溯函数中加start参数,下次递归在start下标后的数据中中取值;
- 去重:当该数据在前边出现过则跳过该循环,在纵向中不需要,横向中需要,用设计used数组和i与start比较的方法需要对数组重新排序,用哈希去重不需要重新排序。
分割问题
- 与组合问题本质一样,组合问题是选取某个数组成组合,分割问题则是选择在那个数的位置切割,切割所生成的最小单元都是连在一起元素,这与组合问题不同。
子集问题
- 和组合问题一样,多了一个空子集。
排列问题
- 组合是无序的而排列是有序的,所以对排列问题不需要从前向后取数据,也可以从后向前取,所以不需要上述的start参数,但要用used数组使得在一个排列中不会被重复选取。
棋盘问题
- 多维的回溯。