三类最基础的DFS问题

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

一、指数型枚举

1、问题

dfs常见问题,# 搜索与图论题目,深度优先,算法,图论

2、思路

这道题dfs中的形参传递的是我们当前所在的位数,dfs函数内部枚举的是当前位数的所有可能。

3、代码

#include<iostream>
#include<cstring>
using namespace std;
const int N=20;
int n;
bool st[N];
void dfs(int u)
{
    if(u>n)
    {
        for(int i=1;i<=n;i++)
            if(st[i])printf("%d ",i);
        cout<<endl;
        return ;
    }
    for(int i=0;i<2;i++)
    {
        if(i)
        {
            st[u]=true;
            dfs(u+1);
        }
        else
        {
            st[u]=false;
            dfs(u+1);
        }
    }
    return ;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

也可以二进制枚举

#include<iostream>
using namespace std;
const int N=20;
int a[N];
int n;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)a[i]=i+1;
    for(int i=0;i<1<<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i>>j&1)cout<<a[j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

二、排列型枚举

1、问题

dfs常见问题,# 搜索与图论题目,深度优先,算法,图论

2、思路

类似于上一题。

3、代码

#include<iostream>
using namespace std;
const int N=11;
int n;
int a[N];
int st[N];
void dfs(int u)
{
    if(u>=n)
    {
        for(int i=0;i<n;i++)cout<<a[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            st[i]=true;
            a[u]=i;
            dfs(u+1);
            st[i]=false;
        }
    }
}

int main()
{
    cin>>n;
    dfs(0);
    return 0;
}

三、组合型枚举

1、问题

dfs常见问题,# 搜索与图论题目,深度优先,算法,图论

2、思路

这道题为了避免重复,我们可以人为的规定一下顺序。文章来源地址https://www.toymoban.com/news/detail-851311.html

3、代码

#include<iostream>
using namespace std;
const int N=30;
int a[N];
bool st[N];
int n,m;
void dfs(int u)
{
    if(u>=m)
    {
        for(int i=0;i<m;i++)printf("%d ",a[i]);
        cout<<endl;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i]&&(!u||i>a[u-1]))
        {
            st[i]=true;
            a[u]=i;
            dfs(u+1);
            st[i]=false;
        }
    }
}
int main()
{
    cin>>n>>m;
    dfs(0);
    return 0;
}

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

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

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

相关文章

  • Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

    深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法,用于在图中搜索目标节点或遍历图的所有节点。本篇博客将介绍 DFS 和 BFS 算法的基本概念,并通过实例代码演示它们的应用。 😃😄 ❤️ ❤️ ❤️ 深度优先搜索( DFS )是一种用于遍历或搜索图或树

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

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

    2024年02月03日
    浏览(41)
  • 数据结构与算法基础-学习-24-图的遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

    目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS(邻接矩阵实现) 2、DFS(邻接表实现) 3、BFS(邻接矩阵实现) 4、BFS(邻接表实现) 5、打印邻接矩阵遍历顺序  6、打印邻接表遍历顺序 八、遍历算法效率分析 1、DFS 2、BFS 九

    2024年02月03日
    浏览(59)
  • BFS算法(宽度优先搜索)超强解析 BFS迷宫问题图文详解 DFS与BFS的区别

      前情回顾:DFS练习-迷宫(最短路径)问题详解 一波三折 图片+文字 以及你需要会的基础:手搓数据结构之队列queue C/C++语言版(BFS算法预备知识) 广度优先搜索(Breadth First Search)简称广搜或者 BFS, 是遍历图存储结构的一种算法 。 BFS的原理是 “逐层扩散” ,从起点出发

    2024年02月22日
    浏览(38)
  • DFS深度优先搜索

    DFS(Depth-First Search) 深度优先搜索,是一种常用的图遍历算法,用于在图或树数据结构中遍历所有节点。 深度优先搜索从一个起始节点开始,沿着一条路径尽可能远地访问节点,直到到达不能继续前进的节点,然后返回上一层继续探索其他路径。这个过程是递归的,通过不

    2024年02月04日
    浏览(24)
  • DFS:记忆化搜索

    . - 力扣(LeetCode)

    2024年04月09日
    浏览(63)
  • DFS—深度优先搜索

    递归函数代码形式 1 1 2 3 5 8 13 21 34 55 89 ... 已知前两项为1,之后每一项等于前两项之和。 现输入n,请输出兔子数列的第n项。 F ( n ) = { 1 ( n = 0 ) n ∗ F ( n − 1 ) ( n 0 ) F(n)=begin{cases}1(n=0)\\\\n*F(n-1)(n0)end{cases} F ( n ) = { 1 ( n = 0 ) n ∗ F ( n − 1 ) ( n 0 ) ​ 不难分析出

    2024年02月20日
    浏览(47)
  • 【搜索】DFS剪枝与优化

    算法提高课笔记 剪枝 是什么意思呢? 我们知道,不管是内部搜索还是外部搜索,都可以形成一棵搜索树,如果将搜索树全部遍历一遍,效率会很低,但如果我们能在搜索的过程中,提前预知,判断某一些不可能是正确答案的情况,就可以不用遍历其下的子树,从而提高我们

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

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

    2024年02月05日
    浏览(33)
  • 算法沉淀 —— 深度搜索(dfs)

    【题目链接】:2331. 计算布尔二叉树的值 【题目】: 【分析】:  在确定一颗二叉树的布尔值前,我们需要先得到左子树、右子树的结果(0/1)。如果左子树、右子树不是叶子节点,显然这是一个递归子问题(将求左子树、右子树的布尔值);  最后就是根据root的值来判断对

    2024年04月14日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包