搜索算法是有目的性的穷举问题的部分或所有可能情况,从而求出可行解的方法。
搜索算法分为:深度优先搜索(深搜,dfs)、广度优先搜索(广搜,bfs)…。剩下的没学也不会,先不管了^ _ ^。
DFS
dfs:从一个初始状态出发,一层一层的往下遍历,直到无法前往下一层或者到达终点。其中的剪枝就是根据题意减去没必要遍历的状态,从而减少时间和空间复杂度。
这里提一下一个极其强大的剪枝方法:
奇偶性剪枝;博客:https://blog.csdn.net/moguxiaozhe/article/details/44941543,建议自己划下01图。
BFS
bfs:从初始状态出发,遍历完当前层所有状态然后再前往下一层。
一般那种找最小步数的题,bfs要更快。
实现方法:队列模拟。
首先队列是先进先出,使初始状态入队后,让其出队,判断当前状态是否满足条件,然后根据当前状态推出下一层的状态,使其入队。循环操作。
这样下来,队列中在后面的状态层数一定会>=前面的状态。
队列的基本操作:
back() :返回最后一个元素
empty() :如果队列空则返回真
front() :返回第一个元素
pop() :删除第一个元素
push() :在末尾加入一个元素
size() :返回队列中元素的个数
然后没了,搜索这东西看着麻烦,其实还真的很麻烦。不过简单的搜索的题还是有点规律的,写的多了,自然就顺手了。还是多刷题吧。
下面推点题好了;
hdu:1016,1241,2553,1175,2128,1716;
poj:2110, 1088, 3414;