回溯和递归是相辅相成的,只要有递归就有回溯(执行完一次递归就自动回溯到上一层)
回溯不是一个高效的算法,而是一个纯暴力的过程
<aside> 💡
有些问题没有更好的解法,只能使用暴力搜索,这时就可以使用回溯法。包括以下问题
回溯法解决的问题都可以抽象为树形结构(N叉树)
void backtracking( 参数 ){
// 终止条件
if( 终止条件 ){
收集结果(通常在叶子节点收集结果)
return;
}
// 单层逻辑(通常为一个for循环,每次循环都继续递归)
for(集合元素集){
// 处理节点的操作(判断当前节点的合法性)
// 递归
// 回溯(还原,撤销对节点的操作)
// (去重操作)
}
}
<aside> 💡
回溯三部曲:
组合问题
分割问题——变种组合问题
子集问题——每步都收集结果
排列问题——活用used数组
棋盘问题——used数组天下无敌(