首页 > 其他分享 >DFS

DFS

时间:2023-03-06 18:36:38浏览次数:33  
标签:语句 递归 int DFS yy vis 回溯

DFS主要思想:1.终点,2.回溯。

一、对于终点,我们要对其做一个特殊的处理也就是对结果的处理,处理完之后结束这一次的递归,即开始这一次递归的回溯

二、回溯,有很多人都卡在这里。以我个人学习的经历来谈谈 --> 回溯就是返回上一次递归,然后执行递归语句下没有执行完的语句。这里注意,要标记,否则会重复,导致无法出递归

拿这段代码来解释解释什么叫返回上一次递归,然后执行递归语句下没有执行的语句。

在这一段代码中我们能看到在满足条件(!vis[xx][yy] && ve[xx][yy] == 1)首先给这个点坐标做了标记,即(vis[xx][yy] = 1)然后就重新进入了dfs这个函数,那么有人就会问:既然重新进入了dfs这个函数,那么(vis[xx][yy] = 0)一步不就走不了?

这就是为后边回溯所留的,即递归语句下没有执行的语句就是(vis[xx][yy] = 0)以及for()循环,当找到最终的答案后,会逐步回溯,即返回上一次递归,去实现这一过程。

可能还是会有疑问,什么叫返回上一次递归?这就好像是我在 i = 2 次递归找到最终答案后,回溯,这就回到了 i = 1 次递归,去实现 i = 1 次递归中的递归语句下没有执行完的语句。

可以通过调试去试试这个过程,更加方便理解上边所说的过程

再来说说在这段代码中两个 return 的作用。首先是第一个 return

作用:结束这一次的递归,回溯,即返回上一次递归

第二个return

结束dfs函数

例子

迷宫问题
/*

  • 默认起点为(1,1),给出迷宫和终点,问到终点最少要几步路程
  • 例如:
  • 5 4
  • 4 3
  • 1 1 2 1
  • 1 1 1 1
  • 1 1 2 1
  • 1 2 1 1
  • 1 1 1 2
  • 结果为7
    */

CODE

#include <bits/stdc++.h>
using namespace std;

int n,m,mi=INT32_MAX;
int p,q;
int ve[100][100],vis[100][100];
int dx[5] = {0,-1,0,1,0};
int dy[5] = {0,0,1,0,-1};
void dfs(int x,int y,int step){
    if(x == p && y == q){
        if(step < mi)mi = step;
        return;
    }
    for (int i = 1; i <= 4; i++) {
        int xx,yy;
        xx = x+dx[i];
        yy = y+dy[i];
        if(!vis[xx][yy] && ve[xx][yy] == 1){
            vis[xx][yy] = 1;
            dfs(xx,yy,step+1);
            vis[xx][yy] = 0;
        }
    }
    return;
}
int main(){
    cin >> n >> m;
    cin >> p >> q;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> ve[i][j];
        }
    }
    vis[1][1] = 1;
    dfs(1,1,0);
    cout << mi << endl;
    return 0;
}

这里注意:DFS算法是将图中所有能走的位置都走了一遍

标签:语句,递归,int,DFS,yy,vis,回溯
From: https://www.cnblogs.com/TFOREVERY/p/17184911.html

相关文章

  • 【DFS】LeetCode 46. 全排列
    题目链接46.全排列思路本题是求排列问题.与组合问题不同的是,在排列问题中,不同的数字顺序被视为不同的排列,比如[1,2]与[2,1]是两种不同的排列。搜索树如下图所示,引......
  • 【DFS】LeetCode 90. 子集 II
    题目链接90.子集II思路去重方法与【DFS】LeetCode40.组合总和II思路相似代码classSolution{privateList<List<Integer>>result=newArrayList<>();......
  • DFS 序求 LCA
    很冷门的科技,但是有着显著的使用效果(减少建立虚树的常数)。本文学习自:Alex_Wei的博客首先遍历一遍整棵树,可以得到整棵树的DFS序和每个点的时间戳(记为\(dfn\))。考虑......
  • 【DFS】LeetCode 78. 子集
    题目链接78.子集思路求子集问题和77.组合(opensnewwindow)和131.分割回文串(opensnewwindow)又不一样了。如果把子集问题、组合问题、分割问题都抽象为一......
  • 【DFS】LeetCode 216. 组合总和 III
    题目链接216.组合总和III思路与【DFS】LeetCode40.组合总和II思路一致,只不过candidates数组在题目中明确说明了只有1到9。代码classSolution{private......
  • C++ 深度优先搜索(DFS) 讲解
    目录DFS初步概念DFS例题-迷宫游戏题目描述输入输出格式输入输出样例输入#1输出#1输入#2输出#2解题思路代码DFS初步概念DFS是一种深度搜索算法,它的特点是"不撞南墙不回头"......
  • dfs+hash
    题目:给定一个n×m的二维矩阵,其中的每个元素都是一个[1,9]之间的正整数。从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。走了k......
  • mac系统上hdfs java api的简单使用
    1、背景在上一节中,我们简单学习了在命令行上如何操作hdfsshellapi,此处我们通过java程序来操作一下。2、环境准备需要在本地环境变量中配置HADOOP_HOME或在程序启动......
  • mac系统上hdfs java api的简单使用
    目录1、背景2、环境准备3、环境搭建3.1引入jar包3.2引入log4j.properties配置文件3.3初始化HadoopApi4、javaapi操作4.1创建目录4.2上传文件4.3列出目录下有哪些文......
  • 【DFS】LeetCode 17. 电话号码的字母组合
    题目链接17.电话号码的字母组合思路使用DFS进行枚举。代码classSolution{privateHashMap<Character,char[]>map=newHashMap<>();privateList<S......