我对DFS的理解

[何为DFS]

  深度优先搜索(Depth-First-Search),简称DFS。是一种常见搜索算法。其方法是从原点不断一条路扩散,当无路可走时回退来走下一条路,直至找到目标或遍历。

[框架]

 int dfs(int n) {
if(到达目标)return n;
else{
for(int i=;i<下一步走法数;++i){
int temp=dfs(n+x);
if(temp!=-)return temp;
}
}
return -;
}

[我对DFS的理解]

  DFS其实十分简单。它的主旨就是只考虑当下怎么走,换句话说就是每次函数调用只走一步,走啊走,走啊走,不经意间发现自己走到了就返回结果就可以了。

  你遇到一个DFS先不要慌张地想它的全部,什么递归出口啦、下一步怎么走啦、返回什么啊······你啥也别想,先写参数,参数怎么写呢?其实无比简单,肯定得有一或多个参数来表示现在所在的位置吧,其次你得有走到这儿的代价吧比如步数,花费什么的。一般的DFS有这些参数足以。然后开始写出口,出口那就更简单了,直接上if干就行,只要现在所在的位置是你要的目标位置就返回结果(一般就是刚才的代价)。如果你已经完成出口那么你的DFS就已经完成一半了。之后就是下一步怎么走,这个就是异常的简单了。会走路吗?会走路就行。只要调用下一层DFS就可以了(注意下一层DFS的参数会变,位置变成要去的位置,代价在原来基础上加上走这步的代价)。如果下一层DFS的有返回值且是一个有效值就返回这个值。最后就是应对无解,只需在函数返回一个值代表无解就可以了。到此为止DFS就写完了。是不是无与伦比的简单呢?

[经典例题]

图的m着色问题(color) AC题解

N 皇后问题(queen.cpp) AC题解

[如何学好DFS]

  DFS应用广泛,大部分难的DFS都是在走下一步上用工夫。

  要想精通需要多见题一定要多写!一定要多写!一定要多写!写代码是懒人干的,但不是给懒到连代码也懒得写的人干的!当你精通DFS后你才可以看到她的美丽,她的简练,她的强大。

2018-10-12 22:00:58

我对DFS的理解的更多相关文章

  1. HDOJ1016 Prime Ring Problem(DFS深层理解)

      Prime Ring Problem                                                                       时间限制: 200 ...

  2. 关于DFS的理解

    DFS(深度优先搜索)相当于暴力寻找有效解的过程 如果把多种情况写成一个树的方式 那么DFS的实质就是遍历所有分枝来寻找最优解 而DFS中遍历所有解的方式采用了我们称之为回溯法的东西 如图所示 图中的 ...

  3. dfs序理解-hdu3887

    dfs序就是相当于把树转化成了一个区间,在区间上进行操作. void dfs(int u, int fa) { l[u]=++key; ; i=e[i].next) { int v=e[i].v; i ...

  4. poj3009 Curling 2.0(很好的题 DFS)

    https://vjudge.net/problem/POJ-3009 做完这道题,感觉自己对dfs的理解应该又深刻了. 1.一般来说最小步数都用bfs求,但是这题因为状态记录很麻烦,所以可以用dfs ...

  5. 图的遍历 | 1131地铁图: dfs复杂模拟题

    这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); ...

  6. nyoj20_吝啬的国度_DFS

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  7. Hadoop基础教程之重新认识Hadoop

      之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功能DFS和MapReduce, DFS可以理解为一 ...

  8. Hadoop学习笔记(6) ——重新认识Hadoop

    Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功 ...

  9. 单词的添加与查找 · Add and Search Word

    [抄题]: 设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词 ...

随机推荐

  1. 解决flutter的image_cropper组件引入报错问题

    在使用flutter的图片裁剪组件image_cropper,github:https://github.com/hnvn/flutter_image_cropper 根据它的要求,安卓需要在文件[A ...

  2. 第一周 IP通信基础学习回顾

    这周的课程首先让我们学习了计算机网络概述,了解计算机网络的定义和功能分别是:资源共享,信息传输与集中处理,负载均衡与分布处理,综合信息服务.同时也对计算机网络的演进,计算机网络的分类,计算机网络的性能 ...

  3. 【Netty】(4)—源码AbstractBootstrap

    源码AbstractBootstrap 一.概念 AbstractBootstrap是一个工具类,用于服务器通道的一系列配置,绑定NioEventLoopGroup线程组,指定指定NIO的模式,指定子 ...

  4. qml demo分析(abstractitemmodel-数据分离)

    一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...

  5. ES 06 - 通过Kibana插件增删改查ES中的索引文档

    目录 1 document的结构 2 document的常见CRUD操作 2.1 添加商品: 添加文档并建立索引 2.2 查询商品: 检索文档 2.3 修改商品: 替换文档 2.4 修改商品: 更新文 ...

  6. 接口测试---Python数据处理需要注意的细节

    一.json模块中的dumps方法 请求接口时params肯定是dict类型的,就是这种{"A":"B"},因为需要传json格式的参数到服务端,但是为了降低c ...

  7. 五行Python代码教你用微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天就来通过itchart库来实现通过微信对电脑的一些操作. 一.安装库 安装itchat itchat ...

  8. LindDotNetCore~Aspect面向方面编程

    回到目录 Aspect面向方面编程 面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计.观点导向编程.剖面导向程序设计)是计算机科学中的一个术 ...

  9. 今天筹备了一件大事:重学JS

    最近在阮大神的博客上看到一篇文章,讲的是关于如何自学计算机技术,原文出自 Teach Yourself Computer Science.看完以后我明白自己的缺陷在哪里,基础不够牢固是我最大的问题. ...

  10. 09 使用Tensorboard查看训练过程

    打开Python Shell,执行以下代码: import tensorflow as tf import numpy as np #输入数据 x_data = np.linspace(-1,1,30 ...