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

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

搜索!很暴力!框架

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

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

算法思路code

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

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

框架class

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

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