第十五届蓝桥杯软件赛省赛第二场C/C++大学A组比赛是面向高校计算机专业学生的一项编程竞赛,旨在提升学生的算法设计与代码实现能力。
### 第十五届蓝桥杯大赛软件赛省赛第二场 CC++ 大学 A组
#### 考生须知及考试流程
##### 考试流程与注意事项
- **开始阶段**:参赛者需首先下载题目,并使用考场提供的解压密码来打开试题。
- **考试时间**:整个考试持续4小时。
- **提交机制**:
- 参赛者可以查看已提交的答案并拷贝这些答案。
- 时间截止后,系统将不再接受新的提交或浏览。
- 对于同一题目,参赛者可以多次提交。最终成绩将以最后一次提交的答案为准。
- 必须通过浏览器进行答案的提交,其他方式无效。
##### 题目类型与要求
- **结果填空题**:这类题目需要直接填写结果,并不需要提供源代码。
- **程序设计题**:参赛者需编写程序来解决特定问题。所编写的程序必须能够针对给定输入产生正确的输出。
- 在评分过程中,使用的测试数据可能不同于示例数据。
- 提交的程序须遵循GNU CC++标准,禁止使用某些特定功能(如绘图、Win32API等)。
- 允许使用STL类库。
- 主函数结束时必须返回0。
- 所有依赖的函数都应在源文件中明确地通过`#include`指令导入。不能省略头文件设置以简化代码。
- 所有的源代码应写在一个单独的文件内。
#### 试题解析
##### 试题A: 艺术与篮球
**问题描述**:小蓝根据日期笔画总数来决定练习书法还是打篮球。如果总笔画数超过50,则选择打篮球;否则,选择练习书法。
**示例**:2024年1月1日(20240101)的日期笔画总数为50,因此小蓝会选择练习书法。
**任务**:统计从2000年1月1日至2024年4月13日之间,小蓝有多少天是在打篮球。
**解题思路**:
1. **日期转换**:将日期转化为“YYYYMMDD”格式的8位数。
2. **笔画计算**:将每个数字对应的汉字笔画数累加起来。
3. **统计**:遍历给定的时间段,计算符合条件的天数。
关键代码示例:
```cpp
#include
#include
int digitToStroke(int digit) {
std::vector strokes = {13, 1, 2, 3, 5, 4, 2, 2, 5, 2}; // 笔画数数组
return strokes[digit];
}
int main() {
int totalDays = 0;
for (int year = 2000; year <= 2024; ++year) {
for (int month = 1; month <= 12; ++month) {
for (int day = 1; day <= ((month == 2 && !(year % 4 != 0 || (year % 100 == 0 && year % 400 != 0))) ? 29 : (month == 2 ? 28 : month >7?31:30)); ++day) {
if ((year > 2024) || (year == 2024 && (month > 4 || (month == 4 && day > 13)))) break; // 结束条件
int date = year * 10000 + month * 100 + day;
int strokeSum = 0;
while (date) {
strokeSum += digitToStroke(date % 10);
date /= 10;
}
if (strokeSum > 50) totalDays++;
}
}
}
std::cout << Total days practicing basketball: << totalDays << std::endl;
return 0;
}
```
##### 试题B: 五子棋对弈
**背景介绍**:小蓝和小桥希望在5×5的棋盘上实现一场平局,以证明他们的友谊。
**任务**:计算在规定条件下,能实现平局的不同棋局面数。
**解题思路**:
1. **棋局分析**:分析所有可能的棋局情况。
2. **状态压缩**:利用状态压缩算法记录棋盘状态。
3. **递归搜索**:递归探索所有可能的下棋顺序,判断是否为平局。
关键代码示例:
```cpp
#include
#include
const int N = 5;
int res = 0;
void dfs(int x, int y, bitset black, bitset white