c++|蓝桥杯真题(3)

c++|蓝桥杯真题(3)
文章图片

hello
我是「 YR_T 」
今天继续来发蓝桥杯真题,这个专栏也已经更新到第三篇了,我目标就是刷爆249道蓝桥杯真题
这么算算我还能发50多篇呢。。。
也祝各位都能拿到省一
废话不多说,直接开始做题!
目录

第一题 「生日蜡烛」2016初赛
分析
代码
【c++|蓝桥杯真题(3)】第二题 「方格填数」2016初赛
分析
代码
第三题 「寒假作业」2016初赛
分析
第一种代码
第二种代码
第四题 「剪邮票」2016初赛
分析
代码
最后

第一题 「生日蜡烛」2016初赛 题目描述:
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
分析 这道题很简单,看注释就能看懂
代码
#include #include using namespace std; int main() { int i; for(i=1; i<236; i++) { int n = i,sum = 0; //n是记录从多大开始过生日的,sum记录共吹灭的蜡烛数 int t = n; //保存一开始过生日时候的岁数 while(true) { sum+=n; //记录总共吹灭的蜡烛 n++; if(sum==236) { cout<236) break; } } return 0; }

第二题 「方格填数」2016初赛 题目描述
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?

c++|蓝桥杯真题(3)
文章图片

输出格式
请填写表示方案数目的整数。
分析 先给方格按顺序排个号,再用 next_permutation 函数全排列,然后把所有相邻差值为1的条件判断一遍。通俗讲就是暴力
代码
#include #include using namespace std; int a[11]={0,1,2,3,4,5,6,7,8,9}; int judge() { if(abs(a[0]-a[1])==1||abs(a[0]-a[3])==1||abs(a[0]-a[4])==1||abs(a[0]-a[5])==1) return 0; else if(abs(a[1]-a[2])==1||abs(a[1]-a[4])==1||abs(a[1]-a[5])==1||abs(a[1]-a[6])==1) return 0; else if(abs(a[2]-a[5])==1||abs(a[2]-a[6])==1) return 0; else if(abs(a[3]-a[4])==1||abs(a[3]-a[7])==1||abs(a[3]-a[8])==1) return 0; else if(abs(a[4]-a[5])==1||abs(a[4]-a[7])==1||abs(a[4]-a[8])==1||abs(a[4]-a[9])==1) return 0; else if(abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1) return 0; else if(abs(a[6]-a[9])==1) return 0; else if(abs(a[7]-a[8])==1) return 0; else if(abs(a[8]-a[9])==1) return 0; return 1; } int main() { int c=0; do { if(judge()) c++; }while(next_permutation(a,a+10)); printf("%d\n",c); return 0; }

第三题 「寒假作业」2016初赛 题目描述
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
c++|蓝桥杯真题(3)
文章图片


每个方块代表1~13中的某一个数字,但不能重复。
比如:
6+ 7 = 13
9- 8 = 1
3* 4 = 12
10 / 2 = 5
以及:
7+ 6 = 13
9- 8 = 1
3 * 4 = 12
10 / 2 = 5
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
输出格式
请填写表示方案数目的整数。
分析
这道题目是从13个数中选12个填到方框里面,是一个全排列问题。最终13个数都会填完
第一种代码
第一段代码,虽然能够运行出结果,但是花费时间需要将近1分钟,做填空题可以用。能运行出答案就行。
#include using namespace std; int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; int ans; bool check(){ if(a[0]+a[1]==a[2]&& a[3]-a[4]==a[5]&& a[6]*a[7]==a[8]&& a[9]%a[10]==0&& a[9]/a[10]==a[11]) return true; return false; } int f(int k){ if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过 if(check()) ans++; } for(int i=k; i<13; i++){ { int t=a[i]; a[i]=a[k]; a[k]=t; } continue; f(k+1); { int t=a[i]; //回溯,返回原来状态 a[i]=a[k]; a[k]=t; } } int main(){ f(0); cout<

第二种代码 {int t=a[i]; a[i]=a[k]; a[k]=t; };
这一行确定了k的位置
#include using namespace std; int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; int ans; bool check(){ if(a[0]+a[1]==a[2]&& a[3]-a[4]==a[5]&& a[6]*a[7]==a[8]&& a[9]%a[10]==0&& a[9]/a[10]==a[11]) return true; return false; } int f(int k){ if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过 if(check()) ans++; } for(int i=k; i<13; i++){ {int t=a[i]; a[i]=a[k]; a[k]=t; } //提前检知,节省运行时间 if((k==2&&a[0]+a[1]!=a[2])||k==5&&a[3]-a[4]!=a[5]){//判断符合条件,再进行递归,不符合直接退出 {int t=a[i]; a[i]=a[k]; a[k]=t; } continue; } f(k+1); {int t=a[i]; a[i]=a[k]; a[k]=t; }//回溯,返回原来状态 } } int main(){ f(0); cout<

第四题 「剪邮票」2016初赛 题目描述
如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)
c++|蓝桥杯真题(3)
文章图片


比如,下面两张图中,粉红色所示部分就是合格的剪取。

c++|蓝桥杯真题(3)
文章图片

c++|蓝桥杯真题(3)
文章图片


请你计算,一共有多少种不同的剪取方法。
输出格式
请填写表示方案数目的整数。
分析 这样用搜索搜不出来,可以先找出小邮票,如果能拼成一个大的邮票,则答案加1。
代码
#include #include using namespace std; int g[3][4],cnt,ans,num[5],vis[3][4]; const int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}}; void dfs(int x,int y) { vis[x][y]=1; //确保不会被重复搜索 cnt++; //cnt=5了就代表5个小邮票可以连成一片 for(int i=0; i<4; i++) { int dx=x+dir[i][0]; int dy=y+dir[i][1]; if(dx<3 && dy<4 && dx>=0 && dy>=0 && vis[dx][dy]==0 &&g[dx][dy]==1) { dfs(dx,dy); } } }void solve(int step,int k) { if(step == 5) {//凑够5个数了就把他存到图 int x,y; for(int i=0; i<5; i++) { x=(num[i]-1)/4; y=(num[i]-1)%4; g[x][y]=1; } dfs((num[0]-1)/4,(num[0]-1)%4); if(cnt==5) { ans++; } cnt=0; //用完置为0,不然数据就错了 memset(g,0,sizeof(g)); memset(vis,0,sizeof(vis)); return; } for(int i=k+1; i<=12; i++) {//生成一个5个数序列,其实用next_permutation函数也行 num[step]=i; solve(step+1,i); } }int main() { solve(0,0); cout<

最后
最后还是祝各位有个好成绩,这是刷爆题目的第三天,加油吧
c++|蓝桥杯真题(3)
文章图片


    推荐阅读