回溯算法
- 回溯利用递归的性质,从问题的起始点出发,不断地进行尝试,回头一步甚至多步再做选择,直到最终抵达终点的过程。回溯解决问题的所有选项可以形象的用树状结构表示,每一条路径path就是一个栈;
- 树结构的深度优先搜索(DFS)的过程就是回溯,回溯到上一层时通过状态重置的思路实现;
- 回溯算法说白了就是穷举法的升级版。搜索过程中使用剪枝函数,剪去一些不可能到达最终状态的节点,从而减少状态空间树节点的生成,提高了效率;
- 使用场景:要求在二维数组中(可能具体表现为迷宫或者棋盘等)上搜索路径,一般用递归实现;
回溯解题模板(C++)
function backtrack(n, used) { //used用来判断这个数之前有没有选择过
// 第一步:判断输入或者状态是否非法
if (input/state is invalid) {
return;
}
// 第二步:判读递归是否应当结束,满足结束条件就保存当前结果并返回
if (match condition) {
return some value;
}
// 遍历当前所有可能出现