第十五届蓝桥杯软件赛省赛PB题目汇集了针对编程基础与进阶技能挑战的问题集,旨在检验参赛者在算法设计、代码实现及问题解决方面的能力。
### 第十五届蓝桥杯大赛软件赛省赛-PB赛题
#### 考生须知及考试规则
- **考试流程**:参赛者需在考试开始后立即下载试题,并使用现场提供的解压密码解开试题文件。
- **考试时长**:4小时。
- **提交规则**:
- 在考试期间,参赛者可以查看已提交的答案并进行复制。
- 考试结束前的最后一刻仍可提交答案。
- 同一题目支持多次提交,最终成绩以最后一次提交为准。
- 必须通过浏览器提交答案,其他任何方式提交均视为无效。
- **题型说明**:
- **结果填空题**:根据题目描述填写结果,无需提供源代码。
- **程序设计题**:设计程序处理给定输入并输出正确结果。评分时将使用不同于示例的不同测试数据,确保程序的通用性。
#### 试题解析
##### 试题A: 穿越时空之门
- **问题描述**:
- 传说中的时空之门连接了二进制世界和四进制世界。勇者的二进制力量等于二进制表示中各数位之和,四进制力量同理。
- 只有当勇者的二进制力量等于四进制力量时才能穿越时空之门。
- 力量值范围为1到2024。
- **解题思路**:
- 遍历1到2024之间的所有整数,计算每个数的二进制表示和四进制表示的数位之和。
- 使用Python内置函数`bin()`和`oct()`来获取二进制和四进制表示,再通过字符串操作计算数位之和。
- 最终统计符合条件的勇者数量。
- **关键代码示例**:
```python
def digit_sum(n, base):
# 计算n在base进制下的数位之和
return sum(int(digit) for digit in format(n, f#{base}o)[2:])
count = 0
for power in range(1, 2025):
binary_sum = digit_sum(power, 2)
quaternary_sum = digit_sum(power, 4)
if binary_sum == quaternary_sum:
count += 1
print(count)
```
##### 试题B: 数字串个数
- **问题描述**:
- 构造长度为10000的数字串,满足不包含0,且包含3和7。
- 输出满足条件的数字串总数,对\(10^9+7\)取模。
- **解题思路**:
- 由于长度固定且要求包含特定字符,可以采用组合数学方法解决。
- 对于每个位置,可以选择除0外的8个数字,但必须确保至少一次出现3和7。
- 使用动态规划或递归算法计算满足条件的组合数。
- **关键代码示例**:
```python
MOD = 10**9 + 7
def count_strings(n):
dp = [0] * 10
dp[0] = 1
dp[3] = dp[7] = 1
for _ in range(n-1):
new_dp = [0] * 10
for i in range(1, 10):
for j in range(1, 10):
if i == j or (i not in [3, 7] and j in [3, 7]):
new_dp[i] = (new_dp[i] + dp[j]) % MOD
dp = new_dp
return sum(dp) % MOD
print(count_strings(10000))
```
##### 试题C: 连连看
- **问题描述**:
- 在\(n \times m\)的矩形网格中,寻找满足条件的整数对。
- 条件为两个整数相等且它们的位置满足\(|i-c| = |j-d| > 0\)。
- **解题思路**:
- 遍历每个元素,记录相同值的元素位置。
- 对于每个元素,计算满足条件的配对数。
- **关键代码示例**:
```python
def find_pairs(grid):
n, m = len(grid), len(grid[0])
pairs = {}
for i in range(n):
for j in range(m):
num = grid[i][j]
if num not in pairs:
pairs[num] = []
pairs[num].append((i, j))
result = 0
for nums in pairs.values():
for i, (a, b) in enumerate(nums):
for c, d in nums[i+1:]:
if abs(a-c) == abs(b-d) and a != c:
result += 1
return result
# 示例输入