DFS深搜算法(详解+例题)

这篇具有很好参考价值的文章主要介绍了DFS深搜算法(详解+例题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Everyday English

DFS是什么?

DFS框架

例题详解

1、全排列问题(洛谷 P1706 C++) 

题目概述

思路点拨

参考代码

2、自然数的拆分问题(洛谷 P2404 C++)

题目概述

​编辑思路点拨

AC代码

结尾

Thank you for listening!


Everyday English

Failure is the mother of success.

失败乃成功之母。

DFS是什么?

DFS是英文Depth-First-Search的缩写,意思是深度优先搜索。

什么是深度优先搜索呢?顾名思义,就是往深处遍历。举个小例子:

假设你现在要挖宝藏,你肯定会往下挖对吧。当你挖到地下10米时,探宝器出现了一个故障。一会儿显示往右下挖,一会儿显示往左下挖。你只好先往左下挖。挖啊挖,不幸的是你挖到了岩石,不能在往下挖了。你只好往回爬,爬到那个分叉口,这次你往右下挖,果然一路顺畅,挖到了宝藏!

这是你挖宝的路线:                                   这是dfs的路线: 

            

DFS深搜算法(详解+例题),算法讲解,算法,深度优先      DFS深搜算法(详解+例题),算法讲解,算法,深度优先

 这下你应该懂dfs的含义了吧。

对了你爬回去的动作,在dfs里叫作回溯。

那dfs有没有框架呢?有是有的,不像贪心没什么框架(有兴趣的可以看一看我博客里的贪心算法讲解)

DFS框架

void dfs(需要啥参数自己定)
{
	if(终止条件)
	{
		cout<<输出答案<<endl; //当然也可以计数等等 
		return 0;
	}
	else
	{
		for(遍历所有可能性)
		{
			if(条件可行)//满足条件时,再去深搜 
			{
				执行操作;
				dfs(变化后的新参数); 
				撤销操作;//回溯 
			 } 
		}
	}
}

话不多说,上例题,边看题边理解!

例题详解

1、全排列问题(洛谷 P1706 C++) 

题目概述

我也有一篇博客是专门讲这道题的,但是那个要VIP,这篇不用,而且内容一样,还不快点个赞!

题目描述:

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式:

一个整数 n。

输出格式:

由 1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5个场宽。

输入输出样例:

输入:3                       

输出:     1     2     3

                1     3     2

                2     1     3

                2     3     1

                3     1     2

                3     2     1

思路点拨

这题是一道用dfs解决的经典问题。

我们可以这样想,有n个数,那么就会有n个空位要填进去数

那么终止条件就应该是当已经填的空位数等于n时

在dfs中,从1到n循环依次判断能否放入空位中。

1:若能,将此数存放置数组内并递归下一个空位,也就是dfs(x+1)

2:若不能,则接着判断下一个数

而此处的判断条件应该是此数是否出现过,因为全排列不能出现相同的数

我们可以定一个vis[]数组来判断此数是否出现过(开始全部为false)。

判断时,只需看看这个位置的数组元素是true还是false。

如果是执行‘思路’正数第四行,如果是执行‘思路’正数第五行。

最后一定要记得把vis[]设为false(也就是回溯)!

参考代码

#include<bits/stdc++.h>
using namespace std;
bool vis[10];
int n,a[100]; 
void dfs(int k)
{
	//当已经填好的空位数=n时,按格式输出a[i]并终止 
	if(k==n)
	{
		for(int i=1;i<=n;i++) cout<<setw(5)<<a[i];
		cout<<endl;
		return;
	}
	//判断 + 填数 
	for(int j=1;j<=n;j++)
	{
		if(!vis[j]) 
		{
			a[k+1]=j;
			vis[j]=true;//不能再用这个数了 
			dfs(k+1);//这个位置已经填好,递归填下一个 
			vis[j]=false;//回溯 
		}
	}
	
}
int main()
{
	cin>>n;
	dfs(0);//表示已经填好的空位数 
	return 0;
}

2、自然数的拆分问题(洛谷 P2404 C++)

题目概述

DFS深搜算法(详解+例题),算法讲解,算法,深度优先思路点拨

看到这题,首先就会想到用深搜。对,这道题的正解的确是深搜

可搜什么呢?假如你看到一道题给出的数字是5,让你拆分,你会怎么分呢?

相信大家的思路都是这样的:

首先确定第一个数字,从小的开始,也就是说第一个数字可以是1。

接下来,我们发现,1后面数字相加的和,只可能是5-1=4。

紧接着,我们把4来拆分,还是从1开始拆,那么现在的算式就变成了1+1。

那后面拆分的总和应该是5-2/4-1=3,以此类推,最终拆成1+1+1+1+1。

那如果第一个数拆2呢,那么剩下的数相加得5-2=3。

再把3拆分,最后得出结果。

这是我们人的思路,那程序怎么写呢?

我们可以dfs(cur,sum),表示当前考虑cur,还剩sum需要划分。

注意:在dfs里因该有两种情况,分别是选或不选。

最后奉上完整代码。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,t=0,a[10000];
void dfs(int cur,int sum)//考虑cur,还剩下sum需要划分 
{
    //当没有余下的(没有需要划分时),输出答案 
    if(sum==0)
    {
        cout<<a[0];
        for(int i=1;i<t;i++) cout<<"+"<<a[i];
        cout<<endl;
        return;
    }
    //如果要考虑的这个数比剩下要划分的大,没办法选,return
    //如果考虑的这个数等于输入的数,不成立,因为拆分至少有两个数,return  
    if(cur>sum||cur==n) return;
    a[t++]=cur;//把考虑的数加入答案数组 
    dfs(cur,sum-cur);//选cur 
    t--;//回溯 
    dfs(cur+1,sum);//不选cur 
}
int main()
{
    cin>>n;
    dfs(1,n); 
    return 0;
}

结尾

你学会了吗?都看到这里了,还不给我一个免费的一键三连?

我还是一名小学生希望多多支持一下,谢谢!文章来源地址https://www.toymoban.com/news/detail-672252.html

Thank you for listening!

到了这里,关于DFS深搜算法(详解+例题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)

    目录 深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜) 深度优先搜索(简称“深搜”或DFS) 广度优先搜索 总结 深度优先生成树和广度优先生成树 非连通图的生成森林 深度优先生成森林 广度优先生成森林 图 1 无向图 深度优先搜索的过程类似于树 的先序遍历 ,首先

    2024年01月20日
    浏览(40)
  • 【算法详解 | DFS算法】深度优先搜索解走迷宫问题 | 深度优先图遍历

    by.Qin3Yu 本文需要读者掌握 结构体 和 栈 的操作基础,完整代码将在文章末尾展示。 特别声明:本文为了尽可能使用简单描述,以求简单明了,可能部分专有名词定义不准确。 栈相关操作可以参考我的往期博文: 【C++数据结构 | 栈速通】使用栈完成十进制数转二四八进制数

    2024年02月03日
    浏览(41)
  • DFS(深度优先搜索算法)入门保姆级超详解

    如题,本篇创作目的在于更精细化理解DFS的运作,篇幅不长,也只是作者的一家之言,只为提供一个对入门者的更精细的解释。 DFS,深度优先搜索算法,首先我们看中文,可以很清楚的理解到这个算法是指搜索操作中优先进行深度也就是纵向的数据筛查。 看搜索的基本思路

    2024年02月07日
    浏览(37)
  • 【Python搜索算法】深度优先搜索(DFS)算法原理详解与应用,示例+代码

    目录 1 基本原理 2 DFS算法流程 3 时间复杂度 4 空间复杂度 5 DFS算法应用案例: 5.1 解决路径查找问题  5.2 解决图的连通性问题 5.3  拓扑排序 5.4  在树结构中进行深度遍历 深度优先搜索(DFS)是一种重要的图遍历算法,用于探索图中的节点和边。 DFS 是一种递归或栈(堆栈)

    2024年02月06日
    浏览(49)
  • C语言递归+DFS(深度优先搜索算法)详解 图文并茂,手把手教你画树状图

    目录 一.标准定义 二.跳台阶(典型递归题目) 三.递归实现指数型枚举 四.递归实现排列型枚举 五.递归实现组合型枚举 六.DFS算法模板 深度优先搜索算法(Depth First Search,简称DFS): 一种用于遍历或搜索树或图的算法 。 沿着树的深度遍历树的节点, 尽可能深的搜索树的分

    2024年02月04日
    浏览(54)
  • 深度优先搜索(DFS)算法

    目录 算法思想 时间复杂度和空间复杂度 算法实现 算法优缺点 应用领域 深度优先搜索(DFS)算法的思想是从图的某个起始顶点开始,沿着一条路径尽可能深入地访问图中的所有顶点,直到不能继续为止,然后返回并探索其他路径。具体而言,DFS算法使用栈数据结构来实现,

    2024年02月05日
    浏览(33)
  • 深度优先搜索(DFS)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的。实现方式是有很多,最

    2024年02月08日
    浏览(39)
  • [算法日志]图论: 深度优先搜索(DFS)

    ​ 深度优先搜索算法是一种遍历图这种数据结构的算法策略,其中心思想是朝图节点的一个方向不断跳转,当该节点无下一个节点或所有方向都遍历完时,便回溯朝上一个节点的另一个方向继续遍历。这种搜索策略与回溯法有异曲同工之妙。 正因为和回溯法有相似之处,所

    2024年02月03日
    浏览(46)
  • 【数据结构与算法】图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

    图 的 遍历 就是 对 图 中的 结点 进行遍历 , 遍历 结点 有如下两种策略 : 深度优先搜索 DFS 广度优先搜索 BFS \\\" 深度优先搜索 \\\" 英文名称是 Depth First Search , 简称 DFS ; DFS 基本思想 : 访问第一个邻接结点 : 从 起始点 出发 , 该 起始点 可能有 若干 邻接结点 , 访问 第一个 邻接结点

    2024年02月02日
    浏览(34)
  • 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次。(连通图与非连通图) 1、访问指定的起始顶点; 2、若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕; 3、若

    2024年01月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包