【万能的搜索】深度优先搜索

当初刚学搜索的时候,搜索是把我搞得一脸懵,知道原理,敲不出代码,后来看大神的题解,写了几道题才搞懂深度优先搜索。

搜索!很暴力!

搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。在竞赛中,搜索法还被当做“救命稻草”——大多数问题都可以使用搜索来谋取部分分数。

深度优先搜索属于其中一种,英文缩写为DFS即Depth First Search。深度优先搜索就是一条路走到黑,不撞南墙不回头的一种遍历方法,确实暴力!

算法思路

如上图所示,这是一个无向图,我们就从A开始搜索。从A出发,先找到了邻节点C(我用的是从左到右的顺序),然后继续搜索,找到了邻节点B,然后我们发现,B除了C以外没有邻节点了,我们就回到C点,这一步叫回溯,之后继续遍历到点D,发现D的邻节点A已经被遍历过了,所以回溯到C,这个时候,我们发现C的所有邻节点都被遍历过了,所以我们继续回溯,回到了A点,开始遍历F这一边。以此类推,我们就把整个图遍历完了,遍历的顺序是A—>C—>B—>D—>F—>G—>E。

真的是好暴力厉害呀!!!

框架

这里给出一个深度优先搜索的框架

1 void DFS(当前状态){
2     if (当前状态为边界){ 
3         if (当前状态为最佳目标状态) 记下最优结果;
4         return//回溯
5     }
6     for (int i =算符最小值; i<= 算符最大值; i++){ //算符i作用于当前状态,扩展出一个子状态;
7         if ((子状态满足约束条件)&&子状态满足最优性要求)) DFS(子状态)
8     }
9 }            

 

posted @ 2019-04-12 21:44  夜雨声烦fff  阅读(172)  评论(0编辑  收藏