🌐前言🌐
- 😃大家好啊,我是只会C也要参加蓝桥杯的FyHAng。今天是蓝桥杯31日冲刺的第3天,我将给大家带来今日三道题的题解。一起加油!💪
⚪️前文指引
Day1️⃣ | 【蓝桥杯31日冲刺】冲刺第1日 |
---|---|
Day2️⃣ | 【蓝桥杯31日冲刺】冲刺第2日 |
🍓一、年龄巧合
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是 2014 年,并且,小明说的年龄指的是周岁。
请推断并填写出小明的出生年份。
题目链接:年龄巧合
这是2014年蓝桥杯国赛的一道填空题。因为该题计算范围并不大,所以直接暴力求解。
- ⭕️ 算法核心:若年份为ABCD,则A+B+C+D = 2014 - ABCD。要注意的是小明的年龄大于表弟,还有 i 的范围不能太大,我觉得1914~2014已经算很大了。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[4];
for(int i = 1914; i <= 2014 ; i++)
{
int age = 2014 - i;
int t = i;
for(int j = 0; j < 4; j++) //把年份的4位数存储进数组里
{
a[j] = t % 10;
t /= 10;
}
if(a[0] + a[1] + a[2] + a[3] == age)
{
printf("%d", i);
break;
}
}
return 0;
}
🍑二、纸牌三角形
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
A,2,3,4,5,6,7,8,9 共 9 张纸牌排成一个正三角形(A 按 1 计算)。要求每个边的和相等。 下图就是一种排法。
这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
题目链接:纸牌三角形
这是2017年蓝桥杯省赛的一道填空题。考察的内容主要是全排列,如果是C++的话,可以直接调用➡️next_permutation() 函数,而我用的是C,很显然就没有这么好的享受,所以只能自己定义全排列函数了。下面看代码把!
- ⭕️ 算法核心:全排列函数,每条边的和相等
代码如下:
#include <stdio.h>
#include <stdlib.h>
void permit(int *a, int n);
void change(int *a,int i);
void panduan();
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int num = 0;
int main(int argc, char *argv[])
{
permit(a, 9);
printf("%d", num / 6);
return 0;
}
void permit(int *a, int n)
{
int i;
if(n == 1) // n为 1的时候,直接去判断
{
panduan();
}
for(i = 0; i < n; i++)
{
change(a, i); //把第 i个位置元素换到第一位
permit(a + 1, n - 1); //把后面的元素递归全排列
change(a, i); //回溯,就是全排列结束,一定要再把第i个元素换回去
}
}
void panduan()
{
int left = a[0] + a[1] + a[2] + a[3];
int mid = a[3] + a[4] + a[5] + a[6];
int right = a[6] + a[7] + a[8] + a[0];
if(left == mid && mid == right)
num++;
}
void change(int *a,int i)
{
int t = a[0];
a[0] = a[i];
a[i] = t;
}
🍐三、取球游戏
今盒子里有 n 个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?
题目链接:取球游戏
输入描述
先是一个整数 n (n<100),表示接下来有 n 个整数。
然后是 n 个整数,每个占一行(整数< 10的4次方 ),表示初始球数。
输出描述
程序则输出 n 行,表示 A 的输赢情况(输为 0,赢为 1)。
输入输出样例
输入
4
1
2
10
18
输出
0
1
1
0
这道题是2012年蓝桥杯省赛的编程题。考察的是很经典的博弈论的知识,关于博弈论的解析,CSDN上有很多解释,大家可以去搜索。我这边就不过多阐述了,直接上代码。
- ⭕️算法核心:博弈论
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[10001] = {0}, b[100];
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &b[i]);
}
for(int i = 1; i < 10000; i++)
{
if(a[i] == 0)
{
a[i + 1] = 1;
a[i + 3] = 1;
a[i + 7] = 1;
a[i + 8] = 1;
}
}
for(int i = 0; i < n; i++)
{
printf("%d\n",a[b[i]]);
}
return 0;
}
✏️总结
今天的三道题难度不大,希望大家可以持之以恒,如果有任何疑问,大家都可以在评论区留言,我看到都会一一回复的!
- 💛💙 新人创作不易,还望一键三连!感谢! 💜 ❤️