0基础算法基础学算法 第八弹 递归进阶,dfs第一讲
最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开始我要回归正轨了,以后基本上都是每周更一篇(注:不是每周一篇0基础算法系列,可能是学习笔记),因为马上我也要去报道了!
-----------正文分割线------------
·之前我早就在第六弹就讲述过关于递归的内容(https://www.cnblogs.com/qj-Network-Box/p/12729230.html)今天我们要讲的dfs便是递归的一种拓展应用,dfs中文全名叫做深度优先搜索,至于什么是深度优先搜索其实也不好解释,所以我们可以在例题中弄明白,dfs的原理就是利用递归的特性,函数套函数,层层递进,越搜越深,这也是它名字的来历,现在我们可以开始我们的第一个示例
一,有1 2 3三个数字卡片放进a b c三个盒子里,有哪些排列组合方法
这道题有好几种做法,比较常规的做法是枚举各种情况,比较简单易懂,循环就完了嘛,循环三次,枚举三个数,每次都枚举1-3的数字卡片,分别装入a b c的盒子里,代码如下
#include <bits/stdc++.h>
using namespace std;
int main(){
int k=;//第三个数
for(int i=;i<=;i++)
for(int j=;j<=;j++)//筛前两个数
{
if(j!=i)
{
while(k==i||k==j)//筛第三个数
{
k++;
k=k%+;//免得k出现大于等于4的情况
}
cout<<i<<" "<<j<<" "<<k<<endl;//输出
}
}
return ;
}
运行结果也很明了

可以看到最后一共六种结果,分别是123 132 213 231 312和321;
这样做当然是可以轻易做出来,但要是不只是有三个球三个盒子呢,如果是100000个球,100000个盒子呢,那就得写100000个循环了,同时if语句也是少不了的,这样一写得写到猴年马月啊,因此这肯定是不可能的,这时候就得请出搜索家族中的dfs,深度优先搜索了
一,dfs解“有1 2 3三个数字卡片放进a b c三个盒子里,有哪些排列组合方法”
写搜索前非常重要的一个步骤是要提前理好思路,如果不太清楚如何整理思路,可以看看我的第一弹(https://www.cnblogs.com/qj-Network-Box/p/12502643.html),按照我的习惯我一般会画一个流程图理清思路,如下图

流程图可以帮我们理好思路,接下来是我们的代码部分
#include <bits/stdc++.h>
using namespace std;
int a[];
int b[];//a是盒子,b是卡片,true表示在手上,false表示不再
void dfs(int k)
{
if(k==)//如果他站在了“第四个”盒子前
{
for(int i=;i<=;i++) cout<<a[i]<<" ";
cout<<endl;
return;//返回上一步
}
for(int i=;i<=;i++)
{
if(b[i]==)
{
a[k]=i;//在a[k]的盒子中装入扑克牌i
b[i]=;//b[i]的卡片已经放在盒子里的
dfs(k+);//递归继续搜下一个盒子
b[i]=;//卡片记得拿回来,搜索剩下的组合时还要用的
}
}
}
int main(){
dfs();//直接调用
return ;
}
运行结果完全正确

结果完全正确
看到这里,很多人会感到很不解,明明套几个循环就可以解决的东西,为什么要这样大费周章地整那么麻烦的递归呢?这道题我们的目的并不是把他真的做出来,而是为了引入这样的概念,况且就像我前面说的,这只是三个数三个盒子,如果是100000个数,100000个盒子呢?那样就只能选择使用dfs的方法了,接下来我再给大家看一道”简单“的题(不太熟练者慎入,这个题大概还要等2-3弹后才会涉及的难度)
二,洛谷题单 八皇后
#include<bits/stdc++.h>
using namespace std;
int n, a[], sum;
bool book[][];
void dfs(int i)
{
int j;
if(i>n)
{
sum++;
if(sum>) return ;
for(int i=;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
return ;
} for(j=;j<=n;j++)
if( !book[][j] && (!book[][i+j]) && (!book[][i-j+n]) )
{
a[i] = j;
book[][j] = ;
book[][i+j] = ;
book[][i-j+n] = ;
dfs(i+);
book[][j] = ;
book[][i+j] = ;
book[][i-j+n] = ;
}
} int main()
{
cin>>n;
dfs();
cout<<sum;
return ;
}
上面是一种解决方式的代码,用的就是dfs,但是里面涉及了一些后两弹会说的一些pmn的内容,到那时候我会以八皇后为例题讲解,关注了我后敬请期待吧!
第八弹 dfs第一讲算是结束了,以后还有第九弹 dfs2,第十弹 dfs3,如果觉得我讲的还不错,就麻烦您动动手指,点赞关注,如果您没有cnblogs的账号,也可以加入QQ群,群号1031457671,或者使用链接加入群聊 https://jq.qq.com/?_wv=1027&k=poupnxU3,群里有丰富资源、电子书,同时也欢迎大家进群交流分享自己的电子书,欢迎各位进群!
0基础算法基础学算法 第八弹 递归进阶,dfs第一讲的更多相关文章
- 干货|漫画算法:LRU从实现到应用层层剖析(第一讲)
今天为大家分享很出名的LRU算法,第一讲共包括4节. LRU概述 LRU使用 LRU实现 Redis近LRU概述 第一部分:LRU概述 LRU是Least Recently Used的缩写,译为最近最 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 解读Raft(一 算法基础)
最近工作中讨论到了Raft协议相关的一些问题,正好之前读过多次Raft协议的那paper,所以趁着讨论做一次总结整理. 我会将Raft协议拆成四个部分去总结: 算法基础 选举和日志复制 安全性 节点变 ...
- 腾讯2017年暑期实习生编程题【算法基础-字符移位】(C++,Python)
算法基础-字符移位 时间限制:1秒 空间限制:32768K 题目: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间. 你能帮帮小Q吗? ...
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- 毕业设计预习:SM3密码杂凑算法基础学习
SM3密码杂凑算法基础学习 术语与定义 1 比特串bit string 由0和1组成的二进制数字序列. 2 大端big-endian 数据在内存中的一种表示格式,规定左边为高有效位,右边为低有效位.数 ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 图像处理之基础---彩色转灰度算法优化rgb to yuv
File: StudyRGB2Gray.txtName: 彩色转灰度算法彻底学习Author: zyl910Version: V1.0Updata: 2006-5- ...
- 算法基础:BFS和DFS的直观解释
算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...
随机推荐
- Java-旋转字符串
描述 旋转字符串 给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转). 挑战 在数组上原地旋转,使用O(1)的额外空间 说明 原地旋转意味着你要在s本身进行修 ...
- JavaScript基础内容
javascript:是个脚本语言,需要有宿主文件,他的宿主文件是html文件.用来交互的 Javascript基础 写法分类: 1.内联(行内):写在标签里面,以事件属性表现 属性名就是事件属性名 ...
- Filebeat日志收集简单使用
1.简略介绍 轻量型日志采集器,用于转发和汇总日志与文件. 官网: https://www.elastic.co/cn/beats/filebeat 2.本文实现的功能 3.事先必备: 至少一台Kaf ...
- 8-Pandas之如何查找存在缺失值的行(any与all详解)
若有一份数据,简略如下: 国家 啤酒消耗量 烈酒消耗量 红酒消耗量 总酒精消耗量 所在大洲 0 Afghanistan 0.0 0.0 0.0 0.0 AS 1 Albania 89.0 132. ...
- PHP user_error() 函数
定义和用法 user_error() 函数创建用户自定义的错误消息. user_error() 函数用于在用户指定的条件下触发一个错误消息.它可以与内建的错误处理程序一起使用,或者与由 set_err ...
- PHP connection_aborted() 函数
实例 创建一个函数(check_abort()),在客户机终止脚本时写入一条日志消息: <?phpfunction check_abort(){if (connection_aborted()) ...
- luogu P4929 【模板】舞蹈链 DLX
LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...
- luogu P3830 [SHOI2012]随机树 期望 dp
LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...
- centos7与centos6命令差异
技术群: 816227112 查看ip centos6 : ifconfigcentos7 : ip addr 修改hostname centos6 : 修改/etc/sysconfig/networ ...
- angular2+ 组件间通信
angular2+ 不同于react的redux,vue的vuex,angular2+其实可实现数据状态管理的方法很多,以下方案一般也足够支撑普通业务: 父子组件通信 1.1 父组件向子组件传递信息( ...