蓝桥杯---第一讲 递归与递推

文章目录

  • 前言
  • Ⅰ. 递归实现指数型枚举
    • 0x00 算法思路
    • 0x00 代码书写
    • 0x00 思考总结
  • Ⅱ. 递归实现排列型枚举
    • 0x00 算法思路
    • 0x01代码书写
    • 0x02 思考总结
  • Ⅲ. 简单斐波那契
    • 0x00 算法思路
    • 0x01 代码书写
  • Ⅳ. 费解的开关
    • 0x00 算法思路
    • 0x01 代码书写
  • Ⅴ. 递归实现组合型枚举
    • 0x00 算法思路
    • 0x01 代码书写
  • Ⅵ. 带分数
    • 0x00 算法思路
    • 0x01 代码书写
  • Ⅶ. 飞行员兄弟
    • 0x00 算法思路
    • 0x01 代码书写
    • Ⅷ. 翻硬币
    • 0x00 算法思路
    • 0x01 代码书写
  • 总结


前言

本篇博客主要打卡记录博主学习蓝桥杯C++AB组辅导课的习题第一章节的题目。


Ⅰ. 递归实现指数型枚举

0x00 算法思路

这一道题主要考查 dfs 算法,然后这一道题就是以位置来进行 搜索 当搜索到最后一个位置的时候就可以 收获结果 然后考虑枚举到的位置 可以选择 或者 不选

0x00 代码书写

#include<bits/stdc++.h>using namespace std;const int N = 16;int n;
int st[N]; // 状态,记录每个位置当前的状态:0表示还没考虑,1表示选,2表示不选 void dfs(int u)
{if(u > n){for(int i = 1 ; i <= n ; ++ i)if(st[i] == 1)cout << i << " ";cout << endl;return;}//不选st[u] = 2;dfs(u + 1);st[u] = 0; //注意恢复现场 //选st[u] = 1;dfs(u + 1); st[u] = 0; //注意恢复现场}int main()
{	cin >> n;dfs(1); //枚举第一个位置 return 0;
}

0x00 思考总结

这一道题目 就是枚举每一个位置,然后进行选这个数字或者不选这个数字,当枚举到末尾的时候就可以进行收获(打印结果) —> 本质就是枚举每一个位置然后根据选或不选进行的排列组合

Ⅱ. 递归实现排列型枚举

0x00 算法思路

利用一个判断数组st数组,检查是否这个位置的数字我已经使用过了,如果使用过了,就继续,如果没有就直接放到a数组里,递归下一个位置

0x01代码书写

#include<bits/stdc++.h>using namespace std;const int N = 11;int n;
int st[N];//记录这个数字是否被使用过false表示没有,true表示用过
int a[N];//存放数字 方便打印void dfs(int u)
{if(u > n)//(u == n + 1)也是可以的表示枚举到最后一个位置{for(int i = 1 ; i <= n; ++ i)cout << a[i] << " ";cout << endl;return; 	}for(int i = 1 ; i <= n ; ++ i){if(st[i] == false){a[u] = i;st[i] = true;dfs(u + 1);st[i] = false; //恢复现场}}return;
}int main()
{	cin >> n;dfs(1); //枚举第一个位置 return 0;
}

0x02 思考总结

对比上一道题目,上一道是根据选或不选来进行排列组合,这一道题目则是根据n的位置的多少进行排列组合,这里面用到了一个 st 数组来判断这一个数字是否被使用过,从而对这n个位置的数字进行排列组合

Ⅲ. 简单斐波那契

0x00 算法思路

简单的递推公式问题

0x01 代码书写

#include <iostream>
using namespace std;
int main()
{int n;cin >> n;int a = 0, b = 1;for (int i = 0; i < n; i ++ ){cout << a << ' ';int c = a + b;a = b;b = c;}cout << endl;return 0;
}

Ⅳ. 费解的开关

0x00 算法思路

暴力枚举第一行的32—>2的5次方 种情况,然后去统计第一行的五位01串中出现1的数量然后进行turn和step++,
然后枚举除了最后一行的前面四行,遇到 ‘0’ 就可以对 i + 1 行 j 列 进行 turn 操作,从而使得 i,j 这个位置的灯改变成亮。
最后去横扫最后一行,看是否有黑的灯,如果有的话,代表我们的操作是无法完成任务的,所以 输出-1
当发现没有黑的时候,就可以取最小值进行迭代了。

这里复制粘贴一下Acwing上边的疑惑讲解:
1.高票题解代码中的 if (k >> j & 1) 究竟什么意思?

其中,k保存的根本就不是第一行的灯所有可能的状态,不然它第j位都为1了还按它干嘛? k单纯只是保存了第一行按开关的32种方式,与输入数据无关。

且大多数题解代码中都规定了k在二进制下某位为1就代表我们选择按下这一位所在编号的开关,你也可以自己规定k在二进制下某位为0才代表我们选择按下这一位所在编号的开关,这都无所谓。

比如k在二进制下表示为10001,就代表我们选择按第一行编号为0和编号为4的开关,然后对输入数据中第一行这两位执行turn操作。
贴一个Acwing大佬写的超级详细的题解
AcWing 95. 费解的开关(有图超详细,看不懂揍我)

0x01 代码书写

#include<bits/stdc++.h>using namespace std;const int N = 6;char g[N][N], backup[N][N];
int dx[5] = {-1,0,1,0,0}, dy[5] = {0,1,0,-1,0};void turn(int x,int y)//dfs--->迷宫类模板
{for(int i = 0 ; i < 5 ; ++ i){int a = x + dx[i], b = y + dy[i];if(a < 0 || a >= 5 || b < 0 || b >= 5) continue;g[a][b] ^= 1;}
}int main()
{	int T;cin >> T;while(T -- ){for(int i = 0 ; i < 5 ; ++ i)for(int j = 0 ; j < 5 ; ++ j)cin >> g[i][j];int res = 10;for(int op = 0 ; op < 32 ; ++ op){memcpy(backup, g , sizeof g);int step = 0;for(int i = 0 ; i < 5 ; ++ i)if(op >> i & 1){step ++;turn(0, i);}for(int i = 0 ; i < 4 ; ++ i)for(int j = 0 ; j < 5 ; ++ j)//对黑的灯进行turn操作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) res = min(res,step);memcpy(g, backup, sizeof g);}if(res > 6) res = -1;cout << res << endl;}return 0;
}

Ⅴ. 递归实现组合型枚举

0x00 算法思路

通过枚举第一个位置和开始的数进行dfs操作,当搜索到最后一个位置的时候就可以收获结果了

0x01 代码书写

#include<bits/stdc++.h>using namespace std;const int N = 30;int n, m;
int st[N];void dfs(int u, int start)
{if(u == m + 1){for(int i = 1 ; i <= m ;  ++ i)cout << st[i] << " ";cout << endl;return; }for(int i = start ; i <= n ; ++ i){st[u] = i;dfs(u + 1, i + 1);st[u] = 0;}
}int main()
{	cin >> n >> m;dfs(1, 1); //枚举第一个位置 return 0;
}

Ⅵ. 带分数

0x00 算法思路

根据 n = a + b / c 变换 成为 : cn = ac + n所以可以先确定ac的值进而确定b的值所以有以下思路:

  1. 枚举a的数值
  2. 枚举c的数值
  3. 判断b是否符合条件

这个题目也用到了全排列的思想—>本节的第二道题目就是全排列题目的代码和思路

0x01 代码书写

#include<bits/stdc++.h>using namespace std;const int N = 10;int n;
bool st[N],backup[N];
int ans;bool check(int a,int c)
{long long b = n * (long long)c - a * c;//防止溢出用long longmemcpy(backup,st,sizeof st);//用备份操作if(!a || !b || !c) return false;while(b)//判断b当中的数字是否被使用过了已经{int x = b % 10;b /= 10;if(!x || backup[x]) return false;//被使用过了就返回falsebackup[x] = true;}for(int i = 1 ; i <= 9 ; ++ i)//最后再对abc三个数字所选的数字看看是否选完了0~9个数字if(!backup[i])return false;return true;
}void dfs_c(int u, int a ,int c)
{if(u > 9) return; //超过9个数就可以returnif(check(a,c)) ans ++; //发现组合就可以 ++ansfor(int i = 1 ; i <= 9 ; ++ i)//去确定c的值{if(!st[i]){st[i] = true;dfs_c(u + 1,a, c * 10 + i);st[i] = false;}}
}void dfs_a(int u , int a)
{if(a >= n) return; //a不能大于nif(a) dfs_c(u,a,0);//a不能是0 然后去找cfor(int i = 1 ; i <= 9 ; ++ i)//去确定a的值{if(!st[i]){st[i] = true;dfs_a(u + 1,a * 10 + i);st[i] = false;}}return;
}int main()
{cin >> n;dfs_a(0, 0);// 去递归搜索 a 一开始选0个数字(用了多少个数),a是0。cout << ans << endl;return 0;
}

Ⅶ. 飞行员兄弟

0x00 算法思路

先说结论,在判断是否要对(i, j)位置的把手进行切换时,只需要计算一下第i行和第j列总共7个把手(以下称为(i, j)对应的十字)中闭合的把手数目,如果是奇数个就进行切换,偶数个就不进行切换。(奇数个是该位置的把手进行过切换的充要条件)

因此我们从上到下从左到右顺次的对16个把手进行上述判断。如果判断结果是奇数个那么说明该位置被切换过,进行记录即可。

0x01 代码书写

#include<bits/stdc++.h>using namespace std;#define x first
#define y secondconst int N = 5;
typedef pair<int,int> PII;
char g[N][N], backup[N][N];int get(int x, int y)
{return x * 4 + y;
}void turn_one(int x, int y)
{if (g[x][y] == '+') g[x][y] = '-';else g[x][y] = '+';
}void turn_all(int x, int y)
{for (int i = 0; i < 4; i ++ ){turn_one(x, i);turn_one(i, y);}turn_one(x, y);
}int main()
{for(int i = 0 ; i < 4 ; ++ i) cin >> g[i];vector<PII> res;for(int op = 0 ; op < 1 << 16 ; ++ op){vector<PII> temp;memcpy(backup, g ,sizeof g);for(int i = 0 ; i < 4 ; ++ i)for(int j = 0 ; j < 4 ; ++ j){if(op >> get(i, j) & 1){temp.push_back({i, j});turn_all(i, j);}}bool has_closed = false;for(int i = 0 ; i < 4 ; ++ i)for(int j = 0 ; j < 4 ; ++ j){if(g[i][j] == '+')has_closed = true;}if(has_closed == false) if(res.empty() || res.size() > temp.size()) res = temp;memcpy(g,backup,sizeof g);}cout << res.size() << endl;for(auto& op : res) cout << op.x + 1 << " " << op.y + 1 << endl;return 0;
}

Ⅷ. 翻硬币

0x00 算法思路

将硬币和目标的样子进行比较,当发现不一样的时候就进行 turn 翻转即可

0x01 代码书写

#include<bits/stdc++.h>using namespace std;const int N=110;
char start[N], aim[N];
int n;void turn(int i)
{if(start[i]=='o') start[i]='*';else start[i]='o';
}int main()
{cin >> start >> aim;n = strlen(start);int res=0;for(int i = 0; i < n - 1 ; i ++){if(start[i] != aim[i]){turn(i), turn(i+1);res ++;}}cout << res << endl;return 0;
}

总结

本篇博客主要讲解了递推与递归的算法,也涉及到了 dfs 搜索算法的使用,其实 dfs 算法可以

  1. 先去想dfs的含义,参数的含义
  2. 找到dfs的结束条件进行收获结果
  3. 根据题目要求实现dfs代码

希望自己可以多多练习,后面蓝桥杯辅导课看完就会去看算法提高课继续提升

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址&#xff1a; GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后&#xff0c;场景视图中有栅格线&#xff0c;这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

JAVA面经整理(8)

一)为什么要有区&#xff0c;段&#xff0c;页&#xff1f; 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式&#xff0c;不过索引信息以及数据记录都是记录在文件上面的&#xff0c;确切来说是…

矩阵的c++实现(2)

上一次我们了解了矩阵的运算和如何使用矩阵解决斐波那契数列&#xff0c;这一次我们多看看例题&#xff0c;了解什么情况下用矩阵比较合适。 先看例题 1.洛谷P1939 【模板】矩阵加速&#xff08;数列&#xff09; 模板题应该很简单。 补&#xff1a;1<n<10^9 10^9肯定…

给列起别名(关键字:as)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1 as 别名1, 列名2 as 别名2, 列名n as 别名n from 表名; 说明&#xff1a;可以省略as&#xff0c;列名和别名之间使用空格…

MySQL——使用mysqldump备份与恢复数据

目录 1.mysqldump简介 2.mysqldump备份数据 2.1 备份所有数据库 2.2 备份一个/多个数据库 2.3 备份指定库中的指定表 3.mysqldump恢复数据 3.1 恢复数据库 3.2 恢复数据表 1.mysqldump简介 mysqldump命令可以将数据库中指定或所有的库、表导出为SQL脚本。表的结构和表中…

并网逆变器+VSG控制+预同步控制+电流电流双环控制(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

火山引擎 ByteHouse:TB 级数据下,如何实现高效、稳定的数据导入

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近期&#xff0c;火山引擎开发者社区、火山引擎数智平台&#xff08;VeDI&#xff09;联合举办以《数智化转型背景下的火山引擎大数据技术揭秘》为主题的线下 Meeup…

做好微信CRM,这些功能你不可不知!

在当前的数字化时代&#xff0c;微信已成为我们日常生活中的重要元素&#xff0c;无论是社交交流、信息传递还是商务合作&#xff0c;微信都扮演着不可或缺的角色。为了更有效地管理微信资源并提高工作效率&#xff0c;很多组织和公司都选择引入微信CRM系统。那么&#xff0c;怎…

【算法学习】-【双指针】-【盛水最多的容器】

LeetCode原题链接&#xff1a;盛水最多的容器 下面是题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…

pandas read_json时ValueError: Expected object or value的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

坦克世界WOT知识图谱三部曲之爬虫篇

文章目录 关于坦克世界1. 爬虫任务2. 获取坦克列表3. 获取坦克具体信息结束语 关于坦克世界 《坦克世界》(World of Tanks, WOT)是我在本科期间玩过的一款战争网游&#xff0c;由Wargaming公司研发。2010年10月30日在俄罗斯首发&#xff0c;2011年4月12日在北美和欧洲推出&…

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …

Linux删除空目录/非空目录和文件

一、删除目录 删除名为mydir的空目录: rmdir mydir 删除名为mydir的非空目录(非空目录是指该目录包含了其他文件或子目录&#xff0c;而不是空的或没有任何内容的目录) rm -r mydir 删除mydir1下的空目录mydir2 rmdir mydir1/mydir2 删除当前目录下所有以dir一个数字结尾的目录…

Nginx限流熔断

一、Nginx限流熔断 Nginx 是一款流行的反向代理和负载均衡服务器&#xff0c;也可以用于实现服务熔断和限流。通过使用 Nginx 的限流和熔断模块&#xff0c;比如&#xff1a;ngx_http_limit_req_module 和 ngx_http_limit_conn_module&#xff0c;可以在代理层面对服务进行限流…

set和map的封装

目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…

GEE16: 区域日均降水量计算

Precipitation 1. 区域日均降水量计算2. 降水时间序列3. 降水数据年度时间序列对比分析 1. 区域日均降水量计算 今天分析一个计算区域日均降水量的方法&#xff1a; 数据信息&#xff1a;   Climate Hazards Group InfraRed Precipitation with Station data (CHIRPS) is a…

嵌入式软件架构基础设施设计方法

大家好&#xff0c;今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西&#xff0c;众说纷纭&#xff0c;各有观点。在我看来&#xff0c;软件架构是软件系统的基本结构&#xff0c;包含其组件、组件之间的关系、组件设计与演进的规则&#xff0c;以及体现这些规则的基…

图像处理与计算机视觉--第五章-图像分割-Canny算子

文章目录 1.边缘检测算子分类2.Canny算子核心理论2.1.Canny算子简单介绍2.2.Canny算子边缘检测指标2.3.Canny算子基本原理 3.Canny算子处理流程3.1.高斯滤波去噪声化3.2.图像梯度搜寻3.3.非极大值抑制处理3.4.双阈值边界处理3.5.边界滞后技术跟踪3.6.Canny算子边缘检测的特点 4…