搜索,所谓的万能算法,搜出答案。搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或者所有的可能情况,从而求出问题的解。但是实际上,用搜索做题几乎是经常TLE的,这也并不是搜索不对,而是在搜的过程要加上一些剪枝,来精简优化。
搜索有两方法,深搜和广搜。
1、深搜
深搜过程用到了回溯思想,通俗讲深搜就是每当有多个选择时找到一条路,沿这条路一直向前走的同时,给自己留下后路(回溯),防止这条路找不到答案,好重新选择。
深搜的模板是最简单的,一眼就能看懂。
DFS(k)
{
If(目的地) 结束;
for(……)
{
保存结果;
DFS(k+1);
回溯;
}
}
2、广搜
广搜用到了队列入队出队,基本思想就像是每次遇到多个选择,都要走上一遍,找不到结果,就每一个节点都在全走下去一步,广搜往往用来求最短路径问题。
广搜的模板则有一点难度,理解上比深搜难了好多。
int BFS()
{
初始化,初始状态存入队列;
head=0; tail=1;
do
{
head++; (出队)
for(i……………)
{
If(符合条件)
{
tail++; (入队)
if(新节点与原已产生节点重复)
tail--; (取消入队)
else if(新节点是目标结点)
退出;
}
}
}
}