我对DFS的理解

[何为DFS]

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

[框架]

 1 int dfs(int n) {
 2     if(到达目标)return n;
 3     else{
 4         for(int i=0;i<下一步走法数;++i){
 5             int temp=dfs(n+x);
 6             if(temp!=-1)return temp;
 7         }
 8     }
 9     return -1;
10 }

[我对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

原文地址:https://www.cnblogs.com/zjd-ac/p/9780950.html

时间: 2024-10-20 15:18:44

我对DFS的理解的相关文章

HDOJ1016 Prime Ring Problem(DFS深层理解)

Prime Ring Problem 时间限制: 2000ms               内存限制: 32768KB                HDU       ID: 1016 题目描述 A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent

hdu1078 记忆化dfs

FatMouse and Cheese Problem Description FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse

【DFS或DP】Zipper

总时间限制: 1000ms 内存限制: 65536kB 描述 Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original o

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

这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); 殊不知本题有多个查询数据.如果只调用一遍还可以蒙混过关,但是这样的错误必然导致wa ac代码: vis[s]=1;dfs(s,e,0);vis[s]=0; 参考柳诺博客修改的AC代码: #include <stdio.h> #include <memory.h> #include &

poj3009 Curling 2.0(很好的题 DFS)

https://vjudge.net/problem/POJ-3009 做完这道题,感觉自己对dfs的理解应该又深刻了. 1.一般来说最小步数都用bfs求,但是这题因为状态记录很麻烦,所以可以用dfs. 2.在用dfs的时候,mp时一个全局变量,对于平等的走法,每一个走法结束后一定要状态复原!!!(也就是代码36-38行)否则会对其他走法产生影响. 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #

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

Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功能DFS和MapReduce, DFS可以理解为一个分布式文件系统,存储而已,所以这里暂时就不深入研究了,等后面读了其源码后,再来深入分析. 所以这里主要来研究一下MapReduce. 这样,我们先来看一下MapReduce的思想来源: alert("I'd like some Spaghetti!

hdu2089(数位DP 递推形式)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25802    Accepted Submission(s): 8967 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以

nyoj20_吝啬的国度_DFS

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000)

ACM总结报告!

ACM总结报告 算法设计 姓名:郭嘉 学号:2015590 专业:网络工程二班 指导老师:费玉奎. 第一次听说ACM这个事情是我们的计算机导论老师岳训老师介绍给我的,他可以算是我计算机的启蒙老师,带我走进了计算机这个大世界.他让我知道了一个优秀的程序员就像是一位"武林高手"一样,需要掌握 "内功"和"外功",外功指的就是程序设计语言,比如C.C++.Java.Python.而内功就是指算法,数据结构,设计模式等等.这"内功"和