首页 > 其他分享 >DFS(深度优先搜索)

DFS(深度优先搜索)

时间:2024-02-18 09:22:58浏览次数:40  
标签:输出 优先 DFS BFS 搜索 深度

DFS(深度优先搜索)

顾名思义,深度优先搜索,即搜索的一种;

在搜索时,优先向下一深度搜索,可以称作回溯法。

主要实现方法是依靠递归函数;

样例

若使用DFS的搜索方法;

在下图树各点中的遍历方法为:

0 - > 1 - > 3 - > 5 - >3 - > 6 - > 3 - > 1 - > 4 - > 7 - > 9 - > 7 - > 4 - > 1 - > 0 - > 2 - > 8 - >9;

可以看到遍历方法优先增加深度(即 层数)

即能向下一层移动,就先向下一层移动,若没有,则回溯到上一层

可以说是 《长驱直入》,也可以说是一条路走到黑(再回头);

典型的递归(不是吗)

DFS模版

int dfs(int t)
{
    if(满足输出条件)         //即递归出口
    {
        输出解;             //若有特殊输出格式,用自定义的 void print 函数
    }
    else
    {
        for(int i=1;i<=尝试方法数;i++)
            if(满足进一步搜索条件)
            {
                为进一步搜索所需要的状态打上标记;
                dfs(t+1);
                恢复到打标记前的状态;//也就是说的{回溯一步}
            }
    }
}

此上为DFS的模版(一般的)可以看出主要依靠不断回溯来找到问题的解;

注意事项:

  1. 第一个if是符合输出解的条件,第二个if是符合进一步搜索的条件;

  2. 下一步搜索时,不是使用return dfs(t+1)而是直接dfs(t+1)

    (可能会注意不到这个关键的地方,以至于每次写完不知道为什么只得到一个答案就返回主程序了)

  3. for 循环之后的 if 可以是多个;

  4. for 循环边界

例题

拿P1706来说

按照字典序输出自然数 1 到 n 所有不重复的排列;

可以看出输出解的条件为当前已选的数的个数为n时,打印解(用print函数);

否则继续搜索;

代码如下:

后记

不过这种方法也有不足之处

也用此图解释,若解为 $2$ 时,这时遍历左半边树是完全没有必要的;

当然我们也有解决的办法(即广度优先搜索(BFS))

这也就显现出了DFS与BFS的不同和各自的适用范围

DFS: 有多少组解的问题

BFS:最优解问题

标签:输出,优先,DFS,BFS,搜索,深度
From: https://www.cnblogs.com/adsd45666/p/18018764

相关文章

  • RabbitMQ 使用细节 → 优先级队列与ACK超时
    开心一刻今天坐在太阳下刷着手机老妈走过来问我:这么好的天气,怎么没出去玩我:我要是有钱,你都看不见我的影子老妈:你就不知道带个碗,别要边玩?我:......优先级队列说到队列,相信大家一定不陌生,是一种很基础的数据结构,它有一个很重要的特点:先进先出但......
  • 力扣 深度优先搜索 199. 二叉树的右视图
    /** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodeleft,Tr......
  • C语言运算符顺序及优先级
    逗号运算符是优先级最低的。通常单目运算符优先级大于双目。三目最小。但需注意,双目运算符中的赋值运算符优先级是最低的。在C语言中,大部分运算符都是从左向右进行计算的,但是也存在一些自右向左的运算符。其中最常见的自右向左的运算符是赋值运算符 = 和逗号运算符 ,。赋......
  • 力扣 230. 二叉搜索树中第K小的元素
    /** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodeleft,Tr......
  • 力扣 递归 98. 验证二叉搜索树
    /** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNode(intval){this.val=val;} *TreeNode(intval,TreeNodeleft,TreeNoderight){ *this.val=val;......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树 (优先掌握递归)| 404.左叶子之和 (优先
    257.二叉树的所有路径 已解答简单 相关标签相关企业 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:ro......
  • 力扣递归 广度优先搜索之102. 二叉树的层序遍历
    classSolution{   List<List<Integer>>result=newArrayList<>();   publicList<List<Integer>>levelOrder(TreeNoderoot){       if(root==null){           returnresult;       }       traverse(root,0);    ......
  • 搜索
    个人见解:目前已知搜索大致分为两类深度优先搜索和广度优先搜索,两个的代码实现难点感觉是因为不懂调用递归的条件和搜索板子的细节点是否注意到深度(dfs):应该就是从初始状态一直挖到最底层直到不能挖为止,此时就return到上一级换另外一种情况来判断是否可以,所以这里有一个细节的就是......
  • hdu 5113 Black And White(DFS染色)
    Problem-5113(hdu.edu.cn)hdu没法提交,我以为我账号又崩了...#include<iostream>#include<cstring>usingnamespacestd;intT,n,m,k,kase;intcolor[30],ans[10][10];boolDFS(intx,inty,intcur){if(x>n)returntrue;for(inti=1;i<=k;i++){......
  • hdu 1175 连连看(DFS+剪枝)
    Problem-1175(hdu.edu.cn)根据转弯次数和有没有找到答案来剪枝#include<iostream>#include<cstring>usingnamespacestd;constintN=1010;intn,m,q,x1,y1,x2,y2,flag;intv[N][N],map[N][N];intdirection[4][2]={{1,0},{-1,0},{0,1},{0,-1}};#definecheck(x,y)......