计蒜客 遇到的第一个dfs算法

来源:互联网 发布:南京软件人才市场 编辑:程序博客网 时间:2024/05/17 22:56

3.深度优先搜索


3.1.举例

给出如图3-1所示的图,求图中的V0出发,是否存在一条路径长度为4的搜索路径。


 

3-1

显然,我们知道是有这样一个解的:V0->V3->V5->V6。

3.2.处理过程

 

3.3.对应例子的伪代码

这里先给出上边处理过程的对应伪代码。

 

Cpp代码  收藏代码
  1. /** 
  2.  * DFS核心伪代码 
  3.  * 前置条件是visit数组全部设置成false 
  4.  * @param n 当前开始搜索的节点 
  5.  * @param d 当前到达的深度,也即是路径长度 
  6.  * @return 是否有解 
  7.  */  
  8. bool DFS(Node n, int d){  
  9.     if (d == 4){//路径长度为返回true,表示此次搜索有解  
  10.         return true;  
  11.     }  
  12.   
  13.     for (Node nextNode in n){//遍历跟节点n相邻的节点nextNode,  
  14.         if (!visit[nextNode]){//未访问过的节点才能继续搜索  
  15.   
  16.             //例如搜索到V1了,那么V1要设置成已访问  
  17.             visit[nextNode] = true;  
  18.   
  19.             //接下来要从V1开始继续访问了,路径长度当然要加  
  20.   
  21.             if (DFS(nextNode, d+1)){//如果搜索出有解  
  22.                 //例如到了V6,找到解了,你必须一层一层递归的告诉上层已经找到解  
  23.                 return true;  
  24.             }  
  25.   
  26.             //重新设置成未访问,因为它有可能出现在下一次搜索的别的路径中  
  27.             visit[nextNode] = false;  
  28.   
  29.         }  
  30.         //到这里,发现本次搜索还没找到解,那就要从当前节点的下一个节点开始搜索。  
  31.     }  
  32.     return false;//本次搜索无解  
  33. }  



 

3.4.DFS函数的调用堆栈

 

此后堆栈调用返回到V0那一层,因为V1那一层也找不到跟V1的相邻未访问节点

 

此后堆栈调用返回到V3那一层

 

此后堆栈调用返回到主函数调用DFS(V0,0)的地方,因为已经找到解,无需再从别的节点去搜别的路径了。

4.核心代码

这里先给出DFS的核心代码。

 

Cpp代码  收藏代码
  1. /** 
  2.  * DFS核心伪代码 
  3.  * 前置条件是visit数组全部设置成false 
  4.  * @param n 当前开始搜索的节点 
  5.  * @param d 当前到达的深度 
  6.  * @return 是否有解 
  7.  */  
  8. bool DFS(Node n, int d){  
  9.     if (isEnd(n, d)){//一旦搜索深度到达一个结束状态,就返回true  
  10.         return true;  
  11.     }  
  12.   
  13.     for (Node nextNode in n){//遍历n相邻的节点nextNode  
  14.         if (!visit[nextNode]){//  
  15.             visit[nextNode] = true;//在下一步搜索中,nextNode不能再次出现  
  16.             if (DFS(nextNode, d+1)){//如果搜索出有解  
  17.                 //做些其他事情,例如记录结果深度等  
  18.                 return true;  
  19.             }  
  20.   
  21.             //重新设置成false,因为它有可能出现在下一次搜索的别的路径中  
  22.             visit[nextNode] = false;  
  23.         }  
  24.     }  
  25.     return false;//本次搜索无解  
  26. }  



 

当然了,这里的visit数组不一定是必须的,在一会我给出的24点例子中,我们可以看到这点,这里visit的存在只是为了保证记录节点不被重新访问,也可以有其他方式来表达的,这里只给出核心思想。

深度优先搜索的算法需要你对递归有一定的认识,重要的思想就是:抽象!

可以从DFS函数里边看到,DFS里边永远只处理当前状态节点n,而不去关注它的下一个状态。

它通过把DFS方法抽象,整个逻辑就变得十分的清晰,这就是递归之美。

上面的文章来自大神:

本文为原创,转载请注明出处:rapheal@iteye

作者:raphealguo(at)qq.com

这个大神讲的比较浅显易懂,算了对dfs有了那么一点点的了解。做的题目是计蒜客上的一个题目。

求整数X。
6 6
1 2 3 4 5 6 
4
看到的博客是用dfs解决的。看了书,问了别人才有了那么一点的大致了解。想到了未名湖畔的烦恼。现在对dfs和动态规划都不懂。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小六角螺丝滑丝怎么办 螺丝拧不下来了怎么办 固定水龙头的螺母扭不动怎么办 小螺丝帽拧花了怎么办 6角螺丝帽拧圆了怎么办 眼镜螺丝滑扣了怎么办 眼镜的螺丝掉了怎么办 螺丝松了怎么办小窍门 螺丝松了怎么办 小窍门 小螺丝完全滑牙怎么办 车座椅螺丝滑丝怎么办 塑料柱突然滑牙怎么办 螺丝底座滑丝了怎么办 螺丝拧木头不紧怎么办 六方螺母滑了怎么办 螺母滑丝怎么拧下来怎么办 安装车牌螺丝眼滑丝了怎么办 注塑机孔螺丝洞滑丝了怎么办 空调内机螺丝洞滑丝了怎么办 小螺丝钉滑牙了怎么办? 螺丝滑扣了怎么办 松 苹果8p螺丝滑了怎么办 座椅孔螺丝滑了怎么办 车轮胎螺丝突扣了怎么办 孔里面滑丝了怎么办 六口螺丝滑扣了怎么办 手机螺丝滑扣了怎么办 超极本没有网线接口怎么办 机动车禁令标识位置放置错误怎么办 六角头冲得不标准怎么办 滚丝杆烫手怎么办怎样能不烫手 带滚花的杆子里面脏怎么办 田螺和玉米吃了怎么办 lv包包螺丝掉了怎么办 螺狮那一段吃了怎么办 吃了不熟的田螺怎么办 包上的螺丝掉了怎么办 工厂打螺丝手疼怎么办 打螺丝打到手痛怎么办 欧曼gtl不烧尿素怎么办 放油螺丝滑牙怎么办