专题五:DFS深度优先搜索

目录

  • 专题五:DFS深度优先搜索
  • 前言
  • 什么是回溯法
  • 如何理解回溯法
  • 回溯法解决的问题
  • 回溯法模板
    • 1 、回溯函数模板返回值以及参数
    • 2、 回溯函数终止条件
    • 3 、回溯搜索的遍历过程
  • 回溯算法模板框架代码如下
  • 递归实现指数型枚举
    • 题目
    • 代码及注释
      • 方法一:递归枚举法(子集)
      • 方法二:递归填坑法(每个数字选与不选)
      • 题解
  • 递归实现排列型枚举
    • 题目
    • 代码及注释
    • 题解
  • 递归实现组合型枚举
    • 题目
    • 代码及注释
    • 题解
  • 迷宫问题
    • 题目
    • 代码及注释
    • 题解
  • 01背包问题
    • 题目
    • 代码及注释
    • 题解
  • 八皇后
    • 题目
    • 代码及注释
    • 题解
  • 方格分割
    • 题目
    • 代码及注释
    • 题解
  • 组队
    • 题目
    • 代码及注释
    • 题解
  • 总结

前言

本专题将讲解算法竞赛中最常用的算法dfs深度优先搜索,也叫回溯搜索法或者“暴力搜索”法,也就是说在比赛的时候就算遇到没有思路的题,也可以用递归实现暴力搜索来骗分。有的同学可能会过多的去纠结一些概念,比如递归、暴力搜索、回溯法、dfs等,其实我们大可不必去纠结,因为dfs和回溯搜索法本身就是一个算法,是用递归操作来实现的,而“暴力搜索”则是民间赋予的称号!! 以下内容,我统称为回溯法(我最喜欢的名字)!

什么是回溯法

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。

回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,也就是暴力搜索

如何理解回溯法

回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

递归里面嵌套着循环,为单层搜索逻辑。

回溯法解决的问题

回溯法,一般可以解决如下几种问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

回溯法模板

1 、回溯函数模板返回值以及参数

在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。

回溯算法中函数返回值一般为void。

再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。

void backtracking(参数)

2、 回溯函数终止条件

什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。

所以回溯函数终止条件伪代码如下:

if (终止条件) {存放结果;return;
}

3 、回溯搜索的遍历过程

在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

分享一张代码随想录的图

回溯函数遍历过程伪代码如下:

for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

backtracking这里自己调用自己,实现递归。

大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

回溯算法模板框架代码如下

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

下面将会列举一些例题以及真题。后续会继续出一期专门的练习题!

递归实现指数型枚举

题目


代码及注释

方法一:递归枚举法(子集)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n;vector<vector<int>> result;vector<int> path;void backtracking(int n, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己if (startIndex > n) { // 终止条件可以不加return;}for (int i = startIndex; i <=n; i++) {path.push_back(i);backtracking(n, i + 1);path.pop_back();}}int main(){cin>>n;backtracking(n,1);//记住二维向量的输出方式!!for(int i=0 ; i <result.size(); i ++ )//把所有方案输出 {for(int j=0;j<result[i].size();j++){printf("%d ",result[i][j]);}puts("");}}

【蓝桥杯C/C++】专题五:DFS深度优先搜索相关推荐

  1. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  2. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

  3. 蓝桥杯备赛(五) 双指针,BFS与图论

    蓝桥杯备赛(五) 双指针,BFS与图论 一.双指针 1.Acwing 1238. 日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有 N 行. 其中每一行的 ...

  4. 蓝桥杯T35 危险系数(DFS)

    title: 蓝桥杯T35 危险系数(DFS) date: 2018-11-26 17:30:39 tags: [算法,蓝桥杯,DFS] categories: [算法] Description 抗日 ...

  5. 蓝桥杯c语言试题幸运数,蓝桥杯  历届试题 幸运数  dfs

    时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,. ...

  6. “暴力美学1”——DFS深度优先搜索

    作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...

  7. 图:DFS(深度优先搜索)图解分析代码实现

    文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...

  8. DFS——深度优先搜索基础

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review DFS--深度优先搜索 的基础知识: [1]深度优先搜索的应用 1.1)深度优先搜索算法描述(转自 ...

  9. dfs深度优先搜索_图的深度优先搜索(DFS)

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

最新文章

  1. Build SSCLI20 under VS2008 full Document (完全手册)
  2. python全栈脱产第25天------组合、多态、封装、property装饰器
  3. 【一个实体对象不能由多个 IEntityChangeTracker 实例引用】原因及解决方法
  4. 深入理解分布式技术 - 缓存过期策略手写LRU
  5. .NET Core开发日志——配置
  6. 代理模式详解(静态代理和动态代理的区别以及联系)
  7. Silverlight Gantt甘特图项目管理解决方案
  8. 更新cocoapods相关问题
  9. sap生产工单报工_SAP作业分割与作业价格计算说明
  10. html5游戏技术指标,2019上半年手游指标报告:Day 1留存率低于30%不及格?
  11. 西班牙语笔记(内附如何练习弹舌)
  12. Python实现常用的假设检验
  13. Java day 31 网络编程和简单练习
  14. 有四个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1.这四个塔的高度为10米。塔以外无建筑物。今输入一个点的坐标,求该点的建筑高度(塔外的高度为0m)
  15. matlab实现调整图片的饱和度
  16. linux打开文件夹
  17. Perforce: Can’t clobber writable file Perforce
  18. Html转义字符表详细记录
  19. java开发一款雷电游戏
  20. 计算机电源维修tny279,电源管理芯片TNY279P

热门文章

  1. bugkuCTF---flag在index里
  2. /Users/apple/.zshrc:2: command not found: i 终端报错解决方法
  3. 配分函数|机器学习推导系列(二十六)
  4. 华为光伏usb适配器_支持22.5W超级快充无线充电,华为P40手机保护壳深度拆解
  5. mysql和ocrcle_oracle 12.1 RAC的ocr磁盘组异常恢复
  6. java 实现ps功能_JS实现在线ps功能详解
  7. BUUCTF--[HarekazeCTF2019]Sqlite Voting
  8. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)
  9. 系统安全性之认证技术
  10. 二、5移动端网页适配