回溯算法是一种纯暴力的搜索。
回溯逻辑一般处于递归函数的下方;
他能解决的问题包含以下几种:
- 组合问题(组合不强调元素的顺序,类似:set;排列强调顺序)
- 切个问题
- 子集问题
- 排列问题
- 棋盘问题(N皇后)
以上这些问题用嵌套循环都是不好解决的,因此要用回溯来解决这些问题
理解回溯
回溯一般都可以抽象为一颗 N 插树;
一般横方向(广度)使用for来遍历,竖方向(深度)使用递归来遍历;
回溯模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}