【蓝桥杯31日冲刺】冲刺第3日

本文介绍了蓝桥杯编程竞赛中的三道题目,包括年龄巧合问题的暴力求解、纸牌三角形的全排列计算以及取球游戏的博弈论策略。通过C语言实现算法,详细解析了每道题目的解题思路和关键代码,帮助读者理解和掌握相关编程技巧。
摘要由CSDN通过智能技术生成

🌐前言🌐

  • 😃大家好啊,我是只会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)。
输入输出样例
输入



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;
}

✏️总结

今天的三道题难度不大,希望大家可以持之以恒,如果有任何疑问,大家都可以在评论区留言,我看到都会一一回复的!

  • 💛💙 新人创作不易,还望一键三连!感谢! 💜 ❤️ 在这里插入图片描述
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值