我对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. 0. VIM 系列 - 源码升级最新版本vim

    卸载原来的vim: $ sudo apt-get remove --purge vim $ suso apt-get clean 下载最新版本源码: $ git clone https://githu ...

  2. python的进程与线程(二)

    线程 之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:         进程:本质上就是一段程序的运行过程(抽象的概念)         线程:最小的执行单元,是进程的实体     ...

  3. 用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH 和 Log

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...

  4. 【Keras篇】---利用keras改写VGG16经典模型在手写数字识别体中的应用

    一.前述 VGG16是由16层神经网络构成的经典模型,包括多层卷积,多层全连接层,一般我们改写的时候卷积层基本不动,全连接层从后面几层依次向前改写,因为先改参数较小的. 二.具体 1.因为本文中代码需 ...

  5. nodejs 使用 ethers创建以太坊钱包

    创建钱包创建钱包流程: 生成随机助记词 => 通过助记词创建钱包=>钱包信息和加密明文(私钥和密码加密) 导入钱包通过插件提供方法,根据助记词|keyStore|私钥,找到钱包信息(地址和 ...

  6. 带你精读你不知道的Javasript(上)(一)

    斌果在这几天看了下你不知道的js这本书,这本书讲的东西还是挺不错的,其中有很多平时我压根没接触到的概念和方法.借此也可以丰富一下我对js的了解. 第一部分 第一章 作用域是什么? 1.程序中一点源代码 ...

  7. Asp.Net Core WebApi中接入Swagger组件(初级)

    开发WebApi时通常需要为调用我们Api的客户端提供说明文档.Swagger便是为此而存在的,能够提供在线调用.调试的功能和API文档界面. 环境介绍:Asp.Net Core WebApi + S ...

  8. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  9. MVC,EF 小小封装

    1.项目中经常要用到 EF,有时候大多数的增删改查都是重复性的东西,本次封装就是为了快速开发,期间没有考虑到架构上的各种思想,就感觉到欠缺点什么东西所以这次将这些拉出来,有存在问题的话还请各位多多指导 ...

  10. java面试记录

    怎么确保一个集合不能被修改   ArrayList<String> list = new ArrayList<>();list.add("x");Colle ...