总的思路
计算机的优势在于它可以无脑的去尝试,所以它可以搜索尽所有的可能,然后选出合适的。但无脑的搜索在问题规模过大时也会非常耗费时间空间,所以我们要编写程序告诉计算机用一个更优的策略继续运行下去。
固定套路
总的来说,搜索与回溯是有固定模板套路的,即遵循
选择一个->探索下一步->回溯
写这样的程序时,我们只需要按这个模版去思考问题,先思考能够选择的范围,然后思考选择了这个之后产生了哪些变化,调用下一步,再看具体情况回溯即可。
框架一
int search(int k){
for(i=1;i<=可选总数;i++)
if(可选){
选上并修改所有产生的变化
if(到达目的地) 输出结果;
else search(k+1);
恢复:取消选上的结果,回退变化的值
}
}
框架二
int search(int k){
if(到目的地) 输出结果;
else{
for(i=1;i<=可选总数;i++)
if(可选){
选上并修改所有产生的变化
search(k+1);
恢复:取消选上的结果,回退变化的值
}
}
}