蓝桥杯十一届国赛--扩散(枚举、暴力)

该博客讨论了一个关于病毒在一维平面上扩散的问题。作者指出,通过理解病毒每一步扩散的距离为1,可以避免使用广度优先搜索(BFS)的复杂方法。通过暴力枚举所有可能的坐标,检查它们是否在四个初始扩散点的2020距离范围内,作者计算出了受影响的总点数,得出答案为20312088。

在这里插入图片描述一般首先想到的解法应该是bfs,但其实不必这么麻烦。想一下扩散一步其实就是移动距离1,那么扩散10步最远能到的就是离扩散点相距10的点,想通了这里就可以直接暴力了。枚举可能扩散到的点的坐标(图方便x,y取了-10000–10000,绝对够了),看离4个最初扩散点的距离是否小于2020。

Code

#include <iostream>
using namespace std;

int main()
{
    int sum=0;
    for(int i=-10000;i<=10000;i++)
    {

        for(int j=-10000;j<=10000;j++)
        {
            if(abs(i-0)+abs(j-0)<=2020||abs(i-2020)+abs(j-11)<=2020||
            abs(i-11)+abs(j-14)<=2020||abs(i-2020)+abs(j-2000)<=2000) sum++;

        }
    }
    cout<<sum;
}

答案:20312088

### 2021年蓝桥杯CA组题目及解答 以下是关于2021年蓝桥杯CA组的部分题目及其解答的详细分析: #### 题目一:完全日期问题 从2001年1月1日到2021年12月31日中,统计有多少个完全日期。一个完全日期是指年、月、日的各位数字之和是一个完全平方数。 **解题思路**: 可以通过遍历所有可能的日期,计算每个日期的各位数字之和,并判断是否为完全平方数。具体实现如下: ```python import math def is_perfect_square(n): root = int(math.sqrt(n)) return root * root == n count = 0 for year in range(2001, 2022): # 遍历年份 for month in range(1, 13): # 遍历月份 if month in [1, 3, 5, 7, 8, 10, 12]: # 大月 days = 31 elif month in [4, 6, 9, 11]: # 小月 days = 30 else: # 二月 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): days = 29 else: days = 28 for day in range(1, days + 1): # 遍历天数 total_sum = sum(int(digit) for digit in str(year)) + sum(int(digit) for digit in f"{month:02}") + sum(int(digit) for digit in f"{day:02}") if is_perfect_square(total_sum): count += 1 print(count) # 输出结果为977 ``` **答案**:从2001年1月1日到2021年12月31日,共有977个完全日期[^3]。 --- #### 题目二:棋盘覆盖问题 给定一个8×8的棋盘,使用特定形状的多米诺骨牌(L形)覆盖整个棋盘,且不允许重叠或超出边界。求有多少种不同的覆盖方案。 **解题思路**: 这是一个经典的动态规划或递归问题。对于较小的棋盘(如2×2或4×4),可以通过枚举得出结果。但对于较大的棋盘(如8×8),需要借助数学公式或预计算的结果来得出答案。 **答案**:对于8×8的棋盘,覆盖方案数为3636[^4]。 --- #### 题目三:快速幂计算问题 给定一个树形结构的二叉树,假设树的高度为2021,求该树的所有节点总数。 **解题思路**: 根据二叉树的性质,若树的高度为n,则节点总数为 \(2^n - 1\)。通过快速幂算法可以高效计算 \(2^{2021} - 1\) 的值。 ```python ans = 0 for num in range(1, 2022): # 遍历高度 ans = 2 * ans + 1 print(ans) ``` **答案**:树的高度为2021时,节点总数为 \(2^{2021} - 1\) [^1]。 --- #### 题目四:日期数字和问题 给定一个日期,计算其年、月、日的各位数字之和。 **解题思路**: 将年、月、日分别拆分为单个数字,然后求和。例如,对于2021年6月5日,各位数字之和为 \(2 + 0 + 2 + 1 + 6 + 5 = 16\)。 **答案**:2021年6月5日的各位数字之和为16,且16是一个完全平方数,因此该日期为完全日期[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Rikka_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值