回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法
递归回溯算法框架:
/*
都是在for下的if下的
保存结果,找下一步,回溯,这三个是一起的
还有一个到达目的地输出解放在外面就好
三个数组:
原数据数组
标记数组
储存结果数组
*/
/*
框架一
*/
int search(int k){
for(int i=1;i<=算法总数;i++){
if(满足条件){
保存结果
if(到目的地) 输出解;
else search(k+1);
恢复:保存结果之前的状态(回溯一步)
}
}
}
/*
框架二
*/
int search(int k){
if(到目的地) 输出解;
else
for(int i=1;i<=算法总数;i++){
if(满足条件){
保存结果
search(k+1);
恢复:保存结果之前的状态(回溯一步)
}
}
}
return只返回当前调用它的函数
return只不过相当于提前走到了函数的结束标志‘}’这,因为走到函数的结束标志‘}’时,也是返回到上一层函数
return只是把return和函数的结束标志‘}’中间的语句给忽略了
上面的分支单层return或者打印结果,对后面出现的分支没有影响
所以在最后面层的return是绝对不会影响到其他函数的计算结果和输出结果的
在以后每次输出结果的时候做一个判断,就能控制结果的输出了
抽象为图形化思维
像回溯的树形结构
像DP的表型结构