搜索是个(暴力的)好东西,学一学还是很有必要滴~
首先就是DFS了,这是个好东西
一般来说,它分为3个阶段:递归——>回溯——>dfs
DFS的过程就类似于走迷宫时死磕一条路,除非走到死胡同,不然一直走下去,并且它会把所有可走的路都走一遍,因此它的效率不高,所以我们通常会加一些优化。
最常用的是剪枝和记忆化
剪枝分为可行性剪枝和最优化剪枝
可行性剪枝就是看看当前的方案是否可行,如果不行,那后面的情况都不用考虑了,直接跳过
最优化剪枝就是看看当前的解与目前的最优解哪个更优,如果当前的解已经不比目前的最优解更优了,就直接跳过
模板:
void dfs(int k)
{
if(k==n)//深度超过范围,找到一个解
{
//处理这个解
return;
}
//扩展结点,如
for(int i=1;i<=n;i++)
{
//处理结点
//继续搜索,如
dfs(k+1);
//有些题需要恢复状态
}
}
接着是BFS,这也是个好东西
它用的是队列辅助,类似于在走迷宫时把当前的所有路记录下来(保存在队列中),之后再去走一走
BFS可以用启发式(如A*大法)优化,就是最乐观地估计当前的最好情况(这个最好情况一般会优于实际的最优解),如果即使是最好的情况也不能比当前的最优解更优,就直接跳过
模板之前放了一个,现在有点晚,我就不写了