DFS

    • 食用指南:
    • 题目描述:
    • 题目分析:
    • 算法原理:
      • 模板算法:
      • DFS:
        • 1. 存储结构:
        • 2. 写作步骤:
        • 3. 应用场景:
        • 4. 搭配使用:
    • 代码实现:
    • 代码误区:
      • 1. 易错点:
      • 2. dfs基础就是递归
  • 本篇感想:

食用指南:

对该算法程序编写以及踩坑点很熟悉的同学可以直接跳转到代码模板查看完整代码
只有基础算法的题目会有关于该算法的原理,实现步骤,代码注意点,代码模板,代码误区的讲解
非基础算法的题目侧重题目分析,代码实现,以及必要的代码理解误区

题目描述:

  • 给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式
共一行,包含一个整数 n。

输出格式
按字典序输出所有排列方案,每个方案占一行。

数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

  • 题目来源:https://www.acwing.com/problem/content/844/

题目分析:

  • 排列顺序是典型的状态题
  • 对每一步的动作,都在总体的状态树中分支出来了对应状态子树
  • 在状态树中进行查找或遍历所有状态,用的都是DFS
  • DFS本身不难,难在题干分析,
    DFS的应用也不止于图论
    需要通过一些关键词意识到本题采用DFS
  • 下面我们来讲解图论

算法原理:

模板算法:

  • 传送门:递归(暂无)
    预计6月底在C语言博客中介绍一下4步写好递归以及如何理解递归

DFS:

1. 存储结构:

  • 递归函数 & 递归栈

2. 写作步骤:

  1. 停止递归的条件
  2. 当层递归的处理
  3. 进入下一层递归
  4. 若有必要,还原一下静态变量

3. 应用场景:

  • 状态题
  • 图论搜索
  • 其余很多意想不到的地方,需要慢慢积累

4. 搭配使用:

  • 递归函数参数,一般参数带有递归函数的层数,已经遍历过的数组的下标,将遍历的数组下标等等
  • book[]数组,记录状态树上当前状态节点是否已到达过,剪掉状态树上不合理枝干,加快速度
  • res变量,记录递归到底时满足题意的状态数目
  • 循环:状态树上一个根节点可能含有很多子节点,需要循环进入子树dfs
  • 还原,当某层或某子树的递归操作全部完成时,去另一子树中递归时,可能需要抹去原有的修改痕迹

代码实现:

#include <iostream>
using namespace std;
const int N = 7+1;
int n;
int arr[N];
//标记是否出现的Hash数组
int book[N];
void dfs(int x){//递归终止条件if(x == n+1){for(int i=1; i<=n; i++) cout <<arr[i]<<" ";cout <<endl;}//当层循环选择数for(int i=1; i<=n; i++){if (!book[i]) {arr[x] = i;book[i] = 1;//进入下一层循环dfs(x+1);//一个状态子树遍历完全后还原改动book[i] = 0;}}
}int main(){cin >>n;dfs(1);
}

代码误区:

1. 易错点:

  1. 终止条件的选择,我们填写n位数,则第n+1层将前n层填写结果输出
  2. 标记数组忘记还原,当遍历完1开头的数字后,2开头时,134…n又可以使用了
  3. 开始递归的层数,开始若从0层填写,则写到n-1层结束,n层时开始输出

2. dfs基础就是递归

  • 大家一定要学好递归后再dfs

本篇感想:

  • 理解递归后,自然会了dfs
  • 本篇不是递归专篇,所以只做宏观讲解
  • 到刷题阶段时,我们都类似本篇这样短小精干
    目前还是模板学习阶段,需要详细讲解原理和细节
  • 看完本篇博客,恭喜已登 《筑基境-初期》

距离登仙境不远了,加油

神机百炼2.39-DFS相关推荐

  1. 点赞!掌握了实在智能IPA就等于学会了神机百炼........

    动漫<一人之下>正在腾讯视频热播,作为八绝技之一的神机百炼一出场便惊艳了所有人,做到了真正地以一当百. 实在智能秋季新品发布会于10月18日20时圆满举行,作为一家行业领先的人工智能科技公 ...

  2. 实在智能发布会带你见证什么是真正属于你的神机百炼?

    动漫<一人之下>正在腾讯视频热播,作为八绝技之一的神机百炼一出场便惊艳了所有人,做到了真正地以一当百. 实在智能秋季新品发布会于10月18日20时圆满举行,作为一家行业领先的人工智能科技公 ...

  3. 神机百炼3.52-Prim

    Prim 食用指南: 题目描述: 题目分析: 算法原理: 模板算法: Prim算法: 1. 适用情况: 2. 存储形式: 3. 初始化: 4. 三大步骤: 5. 模拟过程: 写作步骤: 1. 外层大循 ...

  4. 神机百炼2.50-负环SPFA

    负环SPFA 食用指南: 题目描述: 题目分析: 算法原理: 模板算法: 负环SPFA: 1. 负环可能存在哪里? 2. 存储形式: 3. 负环检测原理: 写作步骤: 1. 初始化: 2. 出队&am ...

  5. 神机百炼1.20-区间合并

    区间合并 食用指南: 题目描述: 题目分析: 算法原理: 1. 区间合并: 2. vector的sort(): 存储形式: 代码实现: 代码误区: 1. 区间合并最难的地方是什么? 2. 区间合并易漏 ...

  6. 神机百炼1.15-双指针/滑动窗口

    滑动窗口 食用指南: 题目描述: 题目分析: 算法原理: 含义: 作用: 已经见过的双指针: 1. 单串双指针-快速排序: 2. 双串双指针-归并排序: 3. 双串双指针-逆序对个数: 滑动窗口模型: ...

  7. 神机百炼2.41-BFS

    BFS 食用指南: 题目描述: 题目分析: 算法原理: 模板算法: BFS: 1. 含义: 2. 数据结构: 3. 查找最短路径 BFS 和 DFS异同: 代码实现: 代码误区: 1. BFS也要防止 ...

  8. 神机百炼2.44-点的层次BFS

    点的层次BFS 食用指南: 题目描述: 题目分析: 算法原理: 模板算法: 本题特殊点: 1. 回顾静态邻接表 2. 回顾BFS 3. 注意点 代码实现: 代码误区: 1.为什么队头出队时检验是否达到 ...

  9. 神机百炼1.5-二分

    整数二分求边界 食用指南: 题目描述: 题目分析: 算法原理: 整数二分的适用范围: 回顾经典单调序列二分模型: 非递减序列求边界二分模型: 写作步骤: 三步走: 核心算法: 代码注意: 代码模板: ...

最新文章

  1. Flume日志收集系统
  2. Svg.Js A标签,链接操作
  3. spark sql 本地调试_干货 | 如何成为大数据Spark高手
  4. python字典默认输出键还是值_说说在 Python 字典中如何在读取不存在的键时得到一个默认值...
  5. Hadoop--xsync分发脚本
  6. android应用程序列表,List列表应用程序-小知识 #103
  7. 如何限制用户在某一时间段多次访问接口
  8. 深入探究VC —— 资源编译器rc.exe(3)
  9. 【题解】狼和羊-C++
  10. 我的天!你竟然不会用IDEA远程调试Tomcat...
  11. win7无线局域网_局域网共享一键修复 19.3.13(推荐更新)
  12. Amazon Alexa Smart Home Skill 增加订阅事件
  13. DOS攻击之Synflood攻击
  14. 虚拟账户 FTP 服务器不能上传可下载
  15. 产品经理如何写PRD文档[最全]
  16. 模仿猫眼电影App一个动画效果
  17. AUTOSAR MCAL PWM
  18. C语言求Fibonacci数列
  19. Mysql 使用存储过程合并多个表数据
  20. 舒舍 舍友的北漂租房故事

热门文章

  1. linux 任务后台bg和fg命令
  2. 浅谈multer(出错勿喷)
  3. [NodeJS] 使用Express multer搭建文件上传服务
  4. aws sqs java_从AWS Lambda读取SQS队列
  5. 2019全国高校深度学习师资培训班第二期结业
  6. unmountable boot volume 0x000000ED
  7. ib课程计算机科学内容,ib课程有哪些课
  8. 使用网络助手连接腾讯云服务器
  9. 小程序开发没有难度但有工作量
  10. 无线蓝牙耳机排行榜,十大口碑最好蓝牙耳机