DFS的个人理解和测试例题

原创 2018年04月16日 18:44:27

深度优先搜索(DFS):

        是一种搜索手段。可以理解为:它从某个位置(起点)开始,沿着一条路不断地向前走直到尽头,然后退后一步,去走其它没走过的路,没有的话,再退后一步,再去选择,直到找到目的地(终点)。

例如下图:

从A(起点)开始走,先走ABD

在D处发现没有子节点,推后到节点B,去走EG

到节点G发现又到了尽头,然后退一步到节点E,发现节点E没有右节点

再退到节点B,发现B的左右节点都走过了,再退到节点A,去走AC

节点C没有左子树,走右子树F,F是尽头,退到C,退到A,返回。


适用场景:

有三个方面,分别是输入数据、状态转换图、求解目标;

输入数据:如果是递归数据结构,如单链表,二叉树,集合,则百分之百可以使用深搜;如果是非递归数据结构,比如一维数组、二维数组、字符串、图,则概率要小一些;

状态转换图:树或者图;

输入数据:必须要走到最深(比如对于树,必须要走到叶子结点)才能得到一个解,这种情况比较适合用深搜;


例题1:

给定整数a1,a2.....an,判断是否可以从中选出若干数,使他们的和恰好为k。

(限制条件:1<=n<=20,-108<=108,-108<=k<=108


简单的DFS运用,每个数据都用两种选择:加上或者不加,时间复杂度:2n

代码:

#define MAX_N 1005
int data[MAX_N];
int n,k;
// 从前i项得到的和sum
bool DFS(int i,int sum)
{
	// n项都计算过了,判断是否等于k
	if(i == n)
		return sum == k;
	// 不加上第i项
	if(DFS(i+1,sum))
		return true;
	// 加上第i项
	if(DFS(i+1,sum+data[i]))
		return true;
	
	return false;
}

结果:


        嗯,一个简单的小例子,就算是比赛一般也就大一前3题吧。

例题2:

        有一个大小为* M的院子,雨后积起了水。‘W’代表积水,'.'代表没有积水。八连通的积水被认为是连接在一起的。请求出院子里总共有多少水洼?(限制条件:N,M<=100)

(八连通表示:上,下,左,右,左上,左下,右上,右下都属于直接连通。下图相对于W的*部分

* * *

*W*

* * *


代码:

#define MAX_N 100

int N,M;
int Map[100][100];

void DFS(int x,int y)
{
	Map[x][y] = '.';	// 判断过的位置变为'.'没有积水
	// 判断连通的八个位置
	for(int dx=-1;dx<=1;dx++)
		for(int dy=-1;dy<=1;dy++)
		{
			int Nx = x + dx;
			int Ny = y + dy;
			if(Map[Nx][Ny] == 'W' && Nx>=0 && Nx<N && Ny>=0 && Ny<M)
				DFS(Nx,Ny);
		}
	return ;
}
int Solve()
{
	int Ans = 0;
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++)
		{
			if(Map[i][j] == 'W')
			{
				// 每一次走入该判断中,代表新增一个水洼,同时把该水洼所有的'W'全改为'.'
				Ans++;
				DFS(i,j);
			}
		}
	return Ans;
}
结果:


测试的数据:

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
一会儿会更新BFS,最近看动态规划有点迷惑,可能会晚一些。



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40315987/article/details/79963630

DFS 和 BFS 的做题感受

最近,很是不在状态啊。 第一,自从回家之后,很是膨胀,大概有十天时间没有更新过博客了,而且暑假学的东西虽然当时可能理解了,但是现在从头开始复习,各种不会,我的天呐,我是怎么了!!!!! 第二,开学...
  • qq_31736627
  • qq_31736627
  • 2016-08-30 21:18:19
  • 551

深度优先搜索(DFS)-例题附思路-总结(一)

关于DFS的定义等基本的东西我就不说了~百度吧。 每个人的学习方法不一样,在我的学习中我是把DFS是分了类的,虽然总体思路是一样的,但是不同的应用环境就会应用不同的DFS模型,是的,模型。 下面我把目...
  • qq_32183461
  • qq_32183461
  • 2016-02-20 20:16:51
  • 11219

递归,回溯,DFS,BFS的理解和模板

LeetCode 里面很大一部分题目都是属于这个范围,例如Path Sum用的就是递归+DFS,Path Sum2用的是递归+DFS+回溯 这里参考了一些网上写得很不错的文章,总结一下理解与模板 ...
  • hellobinfeng
  • hellobinfeng
  • 2013-10-19 04:54:51
  • 11399

dfs算法经典例题

Oil Deposits #include #include int m,n,sum; char map[102][102]; int dir[8][2]= {0,1,0,-1,1,0,...
  • insanity_forever
  • insanity_forever
  • 2015-07-21 19:23:01
  • 1476

DFS(深搜)例题 解题与心得

走迷宫 【问题描述】 有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数...
  • Crazy_Frog
  • Crazy_Frog
  • 2012-03-23 15:51:43
  • 5753

poj入门水题--深度搜索(dfs)题 1011,含各种剪枝,比较经典

深度搜索(dfs)题 1011,含各种剪枝,比较经典
  • qq_17246605
  • qq_17246605
  • 2016-12-25 20:49:40
  • 1252

dfs(简单例题)

基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一直进行到...
  • MBLHQ
  • MBLHQ
  • 2015-08-04 23:33:53
  • 584

DFS深度优先遍历算法简单分析

一般在涉及图论的算法题的时候都会用到遍历有关方面的思想!而DFS也是最常用的一种方法,下面简单地DFS算法作下简单的分析 DFS基本思想:DFS是一个递归的过程(当然也可以不用递归,而且效率更高,但是...
  • matrixa17
  • matrixa17
  • 2014-02-21 13:31:32
  • 1546

简单典型DFS---(解题报告)NOJ1102---黑白图像

黑白图像 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 984 测试通过 : 26...
  • why850901938
  • why850901938
  • 2015-12-10 22:05:14
  • 731

DFS-BFS搜索专题【经典训练题】【有时间一个个做下来】

有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位大虾啦。 pku 1175 Starry Night 题目地址:http://acm.pku.edu.cn/JudgeOnline...
  • YJX_xx
  • YJX_xx
  • 2014-07-06 08:53:26
  • 1541
收藏助手
不良信息举报
您举报文章:DFS的个人理解和测试例题
举报原因:
原因补充:

(最多只允许输入30个字)