蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录

🌈前言

 

📁 枚举的概念

 

📁递归的概念

    例题:

1. 递归实现指数型枚举

2. 递归实现排列型枚举

3. 递归实现组合型枚举

 

📁 递推的概念

   例题:

斐波那契数列

 

📁习题

1. 带分数

2. 反硬币

3. 费解的开关

 

📁 总结

 


🌈前言:

e7156c8b5f4348ffaeef6234ec8ca73e.gif       

         这篇文章主要是准备蓝桥杯竞赛同学所写,为你更好准备蓝桥杯比赛涉及的算法知识点。不知道你是否苦恼于不知算法从何学起,苦恼于网上资料稀少,或者复杂难懂,这篇文章就是帮助这部分同学的。

        这篇文章会将C平滑过度到C++,如果你只学过C语言的基本语法,也没必要担心不合适,涉及到的C++知识点会进行详细讲解。


📁 枚举的概念:

很多问题都可以" 暴力解决 " —— 不用太多脑筋,把所有可能性全部列举出来,然后一一市实验。尽管这样的方法显得很“笨”,但常常是行之有效的。

                                                                                  ——《 算法竞赛入门经典(第2版) 》

        简单的理解就是,列举出所有可能性,逐个实验,合适就留下,不合适就丢弃,看下一个,直到列举完全部数据。

        这里为什么讲解枚举呢,因为在递归和递推的很多题中,常常结合枚举法,所以我们先讲解其概念,方便接下里更好的讲解递归和递推。

        在算法竞赛中,对于大多数人来说,其实并不需要关注算法的优化和鲁棒性(健壮性),只需要AC(通过)即可,所以,在实际比赛中,往往通过暴力枚举的方法就可以获得大部分的分数,所以打好递归和枚举的基础,非常重要。


📁递归的概念:

        递归的思想就是,将一个大问题化解成一个个子问题,直到化解成我们简单理解计算的数。放在C/C++语言中就是,1. 函数自己调用自己;2. 必须有函数调用结束条件;3. 每次调用越来越接近这个条件。

        这个概念相信大家在C语言学习阶段都有学习过,所以我们简单提一下,我们通过例题来更好的理解。当然,如果你感觉一开始很难理解,这很正常,多看几遍思路,照着敲一遍,自己在写一遍(注意这里就不能照着超了,即便错了,也要自己调试,超过15分钟后依旧没思路再来看)。如果感觉头痛,休息一下,再回来敲代码,坚持不放弃就是胜利。

📁 例题:

        我们先给出原题,如果你有思路,可以自己先写一遍。其次,在展示 思路,最后展示代码。

1. 递归实现指数型枚举

92. 递归实现指数型枚举 - AcWing题库

c3e7b9a16f2849a185742cb620fe63c8.png

解题思路:

        我们先创建一个数组,有N+1 个元素,我们使用下标1 ~ N 表示每个数,如果这个数被选择,放如数字1;如果没有被选择,就放入2。最后打印1~N被选择的数。

//引入C语言标准头文件stdio.h ,包含printf 和 scanf函数
//引入C语言标准头文件string.h ,包含字符串 和 内存 函数
#include <cstdio>
#include <cstring>//包含函数cin , cout 类似于 scanf 和 printf 
#include <iostream>//C++STL算法,部分算法的使用
#include <algorithm>using namespace std;const int N = 15;    //数组开辟的多一点,方便操作。int n;int st[N];	//每个数的状态,0代表未知 1代表选取 2代表未选取//u是下标
void dfs(int u)
{if (u > n){for (int i = 1;i <= n;i++){if(st[i] == 1)printf("%d ", i);}puts("");return;}st[u] = 1;	//未选取dfs(u + 1);st[u] = 0;	//还原现场,删掉也可以,下面会重置st[u] = 2;	//选取dfs(u + 1);st[u] = 0;	//还原现场}int main()
{cin >> n;dfs(1);return 0;
}

 

2. 递归实现排列型枚举

94. 递归实现排列型枚举 - AcWing题库

5af5182f31e74a6ab6e77dbe30e5fdf6.png

解题思路:

        这里我们可以沿用上一个题解的思路,不过有了一点延伸。之前我们是对每个数进行枚举,选择或是不选择。

        现在,我们对每个位置进行枚举,枚举出一个没有被选择的数,直到最后一个位置枚举结束,打印。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N=10;    //为了方便理解,下标从1开始int n;
int stu[N];      //每个位置
bool used[N];    //每个数的状态,选择就是 true,没选择就是 false//u就是下标,代表哪一个位置
void dfs(int u)
{if (u > n){for (int i = 1;i <= n;i++){printf("%d ", stu[i]);}puts("");}for (int i = 1;i <= n;i++){if (!used[i]){stu[u] = i;used[i] = true;//递归到下一位置dfs(u + 1);//恢复现场used[i] = false;}}
}int main()
{cin >> n;dfs(1);return 0;
}

3. 递归实现组合型枚举

5dd9476da7ac475d8e9f23ac114cc0c6.png

解题思路:

        什么组合呢,就是不管顺序,例如,{1,2,3} 和 {1,3, 2}若果是排列的话,就是不同的排列;如果是组合的话,就是同一个组合。

        字典序是什么呢,例如 ab 和 ac 的ab字典序较小,比较的就是ASCII码值;abc 和 ab的字典序,ab在前面。

        介绍了上面两个内容,已经有了做题的基础。其实这题也是非常好做的,就是排列型枚举的衍生,可以阅读样例,其实有一种规律就是,每一个位置的数据都比他前一个数据大,也就是我们从小到大依次枚举,得到的就是一个字典组较小的在前的组合。

1. 在每个位置枚举未出现的数字;

2. 每个位置的数据都比前一个位置的数据大

543f1c03ab41468fb989f975a21c159d.png

        这里我们可以进行一个优化,例如,3个位置从1~3中进行组合,如第一个数是2 或者 3 就没必要枚举了,因为没有2 和 3 后面的数不能够填满剩余2 个位置。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 25;int n;
int m;
int ways[N];    //每个位置的数据,存放到数组ways中//u就是下标,start就是比前一个位置的数据大的那个数据
void dfs(int u,int start)
{//这里进行了优化,例如样例中,4和5放在第一个位置就没必要往下枚举了if (n - start < m - u){return;}//枚举完了m个位置,进行打印if(u > m){for(int i =1;i<=m;i++){printf("%d ",ways[i]);}puts("");return ;}//在每个位置上进行枚举操作,枚举没有出现的数字,并保持有序for(int i=start;i<=n;i++){ways[u] = i;dfs(u + 1 ,i + 1);}
}int main()
{cin>>n>>m;dfs(1,1);    //下标从1开始;start = 1,即从1开始枚举return 0;
}

📁 递推的概念:

        递归的理解就是,先求出小问题,再由小问题求出大问题。下面就用斐波那契数列作为讲解,第三项就是前两项求和。

 

📁例题:

斐波那契数列

#include <iostream>using namespace std;int n,fib[50];int main(){cin >> n;feibo[0]=0;feibo[1]=1;for(int i=2;i<n;++i) fib[i]=fib[i-1]+fib[i-2];for(int i=0;i<n;++i) printf("%d ",fib[i]);return 0;
}

📁习题:

1. 带分数

1209. 带分数 - AcWing题库

806c0c9ff70d4e9dbc32b0012b6ce51f.png

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 20;bool used[10];int num;
int ans;bool check(int a, int c)
{long long  b = num * (long long)c - a * c;if (!a || !b || !c){return false;}bool backup[N];memcpy(backup, used, sizeof used);while (b){int i = b % 10;b /= 10;if (!i ||backup[i]){return false;}backup[i] = true;}for (int i = 1;i < 10;i++){if (!backup[i]){return false;}}return true;
}void dfs_c(int u,int a, int c)
{if (u > 9){return;}if (check(a, c)){ans++;}for (int i = 1;i <= 9;i++){if (!used[i]){used[i] = true;dfs_c(u + 1, a, c * 10 + i);used[i] = false;}}
}void dfs_a(int u,int a)
{if (a >= num){return;}if (a){dfs_c(u, a, 0);}for (int i = 1;i <= 9;i++){if (!used[i]){used[i] = true;dfs_a(u + 1, a * 10 + i);used[i] = false;}}
}int main()
{cin >> num;dfs_a(0,0);cout << ans;return 0;
}

2. 翻硬币

1208. 翻硬币 - AcWing题库

e6bd3360c9eb488c99a0574a6376d501.png

3. 费解的开关

95. 费解的开关 - AcWing题库

4a9b8e6ccc494c30ad0bc7763b1dec82.png

9f697fb2daff4c52a52bb4e1e3cb52a3.png

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;char g[6][6], back[6][6];
int T;
int dx[5] = { -1,0,1,0,0 }, dy[5] = { 0,1,0,-1,0 };void turn(int x,int y)
{for (int i = 0;i < 5;i++){int a = x + dx[i];int b = y + dy[i];if (a < 0 || a >= 5 || b < 0 || b >= 5){continue;}g[a][b] ^= 1;}
}int main()
{cin >> T;while (T--){//对每一行进行输入for (int i = 0;i < 5;i++){cin >> g[i];}int ret = 10;//枚举第一行的操作for (int op = 0;op < 32;op++){int step = 0;memcpy(back, g, sizeof g);//对第一行进行操作for (int i = 0;i < 5;i++){if (op >> i & 1){step++;turn(0, i);}}//对第2 - 4 行进行操作for (int i = 0;i < 4;i++)for (int j = 0;j < 5;j++){if (g[i][j] == '0'){step++;turn(i + 1, j);}}//对最后一行进行检查bool dark = false;for (int i = 0;i < 5;i++){if (g[4][i] == '0'){dark = true;break;}}if (!dark)ret = min(step, ret);memcpy(g, back, sizeof g);}if (ret > 6)ret = -1;cout << ret << endl;}return 0;
}

📁 总结:

        以上,我们就对递归、递推和枚举在蓝桥杯中的知识点进行了讲解,并针对性的讲解了例题,当然这也只是帮你更好的理解这些算法知识,想要学好算法,还需要不断地刷题练习,这里推荐到洛谷,acwing等网站进行练习,比如你看完了这篇文章,做回了例题习题,就可以上这些网站进行想应的练习。

ab04542dc14e495c8760ec1cf785fce1.gif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你安装Kali Linux

Kali Linux操作系统 Kali Linux&#xff0c;一种基于Debian的Linux发行版&#xff0c;是用于渗透测试和网络安全领域的专业工具。它包含了大量的安全测试工具和漏洞扫描器&#xff0c;用于评估网络的安全性和防御能力。Kali Linux有一个友好的界面和易于使用的工具&#xff0c…

数字调制学习总结

调制&#xff1a;将基带的信号的频谱搬移到指定的信道通带内的过程。 解调&#xff1a;把指定信号通带内的信号还原为基带的过程。 1、2ASK调制 原理如下图所示&#xff0c;基带信号为单极不归零码&#xff0c;与载波信号相乘&#xff0c;得到调制信号。 调制电路可以用开关…

力扣-收集足够苹果的最小花园周长[思维+组合数]

题目链接 题意&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 &#xff0c;且每条边都与两条坐标轴之一平行。 给你一个整…

非对称加密与对称加密的区别是什么?

在数据通信中&#xff0c;加密技术是防止数据被未授权的人访问的关键措施之一。而对称加密和非对称加密是两种最常见的加密技术&#xff0c;它们被广泛应用于数据安全领域&#xff0c;并且可以组合起来以达到更好的加密效果。本文将探讨这两种技术的区别&#xff0c;以及它们在…

输电线路导线舞动在线监测装置_带气象监测-深圳鼎信

导线舞动是指输电线路上的导线在风的作用下产生的高频振动现象。如果导线舞动幅度过大&#xff0c;会给电网运行造成威胁&#xff0c;例如可能会导致导线相间放电、挂线等问题&#xff0c;长时间的高频振动还可能引发断线、杆塔倒塌等事故。为了保障电网的安全运行&#xff0c;…

DBAPI个人版如何升级到企业版

安装好企业版软件&#xff0c;并启动 注意要新建mysql数据库&#xff0c;执行新版本的ddl_mysql.sql脚本 在旧版本系统中分别导出数据源、分组、API&#xff0c;得到3个json文件 注意全选所有的数据导出 在新版本系统中导入数据源 在新版本系统中导入分组 进入分组管理菜单&…

【Vue3干货】template setup 和 tsx 的混合开发实践

前言 一般而言&#xff0c;我们在用Vue的时候&#xff0c;都是使用模板进行开发&#xff0c;但其实Vue 中也是支持使用jsx 或 tsx的。 最近我研究了一下如何在项目中混合使用二者&#xff0c;并且探索出了一些模式&#xff0c; 本文就是我在这种开发模式下的一些总结和思考&am…

华为配置策略路由(基于IP地址)示例

组网需求 如图1所示&#xff0c;汇聚层Switch做三层转发设备&#xff0c;接入层设备LSW做用户网关&#xff0c;接入层LSW和汇聚层Switch之间路由可达。汇聚层Switch通过两条链路连接到两个核心路由器上&#xff0c;一条是高速链路&#xff0c;网关为10.1.20.1/24&#xff1b;另…

基于大语言模型LangChain框架:知识库问答系统实践

ChatGPT 所取得的巨大成功&#xff0c;使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而&#xff0c;即使大语言模型的调用相对简单&#xff0c;仍需要完成大量的定制开发工作&#xff0c;包括 API 集成、交互逻辑、数据存储等…

Databend 开源周报第 125 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 密码策略 Data…

智能优化算法应用:基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于浣熊算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.浣熊算法4.实验参数设定5.算法结果6.参考文献7.MA…

麒麟V10arm桌面版的安装包在麒麟V10服务器版安装

安装过后&#xff0c;可执行程序可能运行不了&#xff0c;看起来就像没识别为可执行程序。在终端运行&#xff0c;会发现其实是缺少了某些库&#xff0c;比如libicui18n.so.66、libicuuc.so.66、libicudata.so.66和libm.so.6库版本不对。 报这个错&#xff1a;error while loa…

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE

我的报错&#xff1a; PICO4企业版。安装apk&#xff0c;报错“安装失败。&#xff08;所属的Unity项目打包的apk&#xff0c;被我在同一台pico4安装了20次&#xff09; 调试方法&#xff1a; PIco4发布使用UNITY开发的Vr应用&#xff0c;格式为apk&#xff0c;安装的时候发生…

Quartz持久化(springboot整合mybatis版本实现调度任务持久化)--提供源码下载

1、Quartz持久化功能概述 1、实现使用quartz提供的默认11张持久化表存储quartz相关信息。 2、实现定时任务的编辑、启动、关闭、删除。 3、实现自定义持久化表存储quartz定时任务信息。 4、本案例使用springboot整合mybatis框架和MySQL数据库实现持久化 5、提供源码下载 …

众和策略:12月新批国产网游版号数量过百

上星期五&#xff08;22日&#xff09;&#xff0c;A股冲高回落&#xff0c;三大股指挨近午盘拉升走高&#xff0c;午后再度回落走低&#xff0c;沪指尾盘跌幅收窄。到收盘&#xff0c;沪指跌0.13%报2914.78点&#xff0c;深成指跌0.39%报9221.31点&#xff0c;创业板指跌0.37%…

构建外卖系统:从技术到实战

在当今高度数字化的社会中&#xff0c;外卖系统的开发变得愈发重要。本文将从技术角度出发&#xff0c;带领读者一步步构建一个基础的外卖系统&#xff0c;并涵盖关键技术和实际代码。 1. 技术选型 1.1 后端开发 选择Node.js和Express框架进行后端开发&#xff0c;搭建一个灵…

Kruskal算法求最小生成树(kruskal算法)

题目描述 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff…

【操作系统】探究进程奥秘:显示进程列表的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

OpenCV之图像匹配与定位

利用图像特征的keypoints和descriptor来实现图像的匹配与定位。图像匹配算法主要有暴力匹配和FLANN匹配&#xff0c;而图像定位是通过图像匹配结果来反向查询它们在目标图片中的具体坐标位置。 以QQ登录界面为例&#xff0c;将整个QQ登录界面保存为QQ.png文件&#xff0c;QQ登…

IDEA2023版如何创建web项目

一、新建项目 点击File->New->Project...&#xff0c;如果是第一次创建项目则单击New Project 二、添加Web Application 建好的样子 把web移动到main目录下同时改名为webapp 三、不存在Add Framework Support添加Web Application 如何存在Add Framework Support&#x…