蓝桥杯剪邮票真题解析:如何用DFS+排列组合高效解题(附完整代码)

树莓派通过TTL3.3转485 Modbus采集水表 所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派... 阅读详情

蓝桥杯“剪邮票”难题的降维打击:从暴力枚举到连通性判定的思维跃迁

如果你正在备战蓝桥杯,尤其是被那些看似简单、实则暗藏玄机的“填空题”所困扰,那么“剪邮票”这道题很可能就是你算法思维进阶路上的一块试金石。它表面上是一个简单的组合选取问题,但内核却巧妙地融合了排列组合、深度优先搜索(DFS)以及二维平面上的连通性判定。很多初学者第一次接触时,会不自觉地陷入“如何生成所有5个格子的组合”以及“如何判断它们是否连通”这两个泥潭中,写出的代码要么冗长低效,要么逻辑漏洞百出。

今天,我们不打算照本宣科地复述一种解法,而是想和你一起,像侦探破案一样,层层剥开这道题目的外壳,探索多种解题路径的思维过程。你会发现,掌握一道经典赛题的精髓,远不止于背下一个AC代码,更在于理解其背后的问题转化艺术和算法工具的选择逻辑。我们将从最直观的暴力思路开始,逐步引导至高效优雅的解法,并深入探讨其中的细节陷阱和性能优化空间,目标是让你下次遇到类似“在网格中选取特定数量连通块”的问题时,能拥有清晰的解决框架。

1. 问题重述与核心难点剖析

题目描述很简单:一个3行4列的网格,共有12个格子,代表12张邮票。我们需要从中剪下恰好5张邮票,并且这5张邮票在网格上必须是连通的(仅考虑上下左右四个方向,对角线接触不算连通)。最终需要输出所有不同的剪取方法总数。

那么,难点究竟在哪里?

  1. 组合爆炸:从12个格子中选5个,单纯的组合数 C(12,5) = 792 种。这个数量级对于计算机来说看似不大,但关键在于我们需要对每一种选法进行连通性判断。如果连通性判断算法效率低下,792次判断也可能成为瓶颈。
  2. 连通性判定:这是本题的核心算法考点。给定一个由0和1组成的二维矩阵(1代表选中),如何高效判断所有“1”是否构成一个连通块?这需要用到图论中的遍历算法。
  3. 去重:不同的选取顺序可能对应同一种形状的邮票组合。我们的计数方法必须确保每种形状只被计算一次,而不是每种“选择顺序”都被计算。

很多同学的第一个直觉是:“我直接生成所有5个格子的组合,然后对每个组合跑一遍BFS或DFS检查连通不就行了?”这个思路方向是对的,但如何“生成所有组合”以及“如何高效检查”,里面就有不少门道了。我们首先来看看这个最直接的思路如何实现,以及它可能遇到的问题。

2. 暴力枚举的起点:生成所有组合

我们用一个长度为12的一维数组 a 来表示选择状态,其中5个位置为1(选中),7个位置为0(未选中)。生成所有这样的数组,本质上就是生成所有包含5个1和7个0的排列。

这里第一个技巧就出现了:我们需要的不是所有排列(12!),而是所有组合的模式。因为 [1,1,1,1,1,0,0,0,0,0,0,0] 和 [1,1,1,1,0,1,0,0,0,0,0,0] 如果只是1和0的位置不同,但对应的选中格子集合是相同的,那么它们就是同一种组合。直接生成排列会产生大量重复。

C++的STL库提供了一个神器:std::next_permutation。它的一个美妙特性在于,当对已排序的序列进行全排列时,它生成的是无重复的字典序排列。我们可以利用这个特性来生成所有组合模式。

int a[12] = {0,0,0,0,0,0,0,1,1,1,1,1}; // 初始状态,7个0在前,5个1在后
do {
    // 对当前排列a进行连通性判断
    if (is_connected(a)) {
        ans++;
    }
} while (std::next_permutation(a, a+12));

为什么这样可行?初始数组是排序好的(所有0在1之前)。next_permutation 会遍历这个序列所有不同的排列。由于0和0之间、1和1之间是不可区分的,所以它遍历的每一种排列,都唯一对应了一种5个格子的选择方案(即1所在的下标集合)。这样就完美解决了生成无重复组合的问题。

注意:这里的关键是初始数组必须排序。如果初始数组是乱序的,next_permutation 仍然会生成所有排列,但可能会跳过一些字典序更小的排列,导致漏解。

生成了组合之后,我们接下来就要面对核心挑战:is_connected 函数如何实现?

3. 连通性判定的艺术:DFS/BFS的巧妙应用

连通性判定是一个经典的图遍历问题。我们可以把选中的5个格子看作图中的节点,如果两个选中格子上下左右相邻,则认为它们之间有一条边。问题转化为:判断这个图是否是一个连通图。

一个非常直接的想法是:先找到任意一个被选中的格子作为起点,然后从这个起点出发,进行深度优先搜索(DFS)或广度优先搜索(BFS),遍历所有与其连通的选中格子。遍历结束后,检查是否所有被选中的格子都被访问过。如果是,则说明整个图是连通的。

具体步骤拆解:

  1. 二维化:将一维数组 a 映射回3x4的二维网格 grid 中,便于进行上下左右的邻居访问。
  2. 寻找起点:遍历网格,找到第一个值为1的格子,作为DFS/BFS的起点 (start_x, start_y)。
  3. 执行遍历:从起点开始,向四个方向(上、下、左、右)递归或迭代地探索。探索的条件是:坐标合法,并且该格子值为1(选中且未被访问过)。访问过的格子需要做标记(例如将其值设为0或一个特殊的访问标记),避免重复访问。
  4. 验证结果:遍历结束后,再次扫描整个网格。如果还存在值为1的格子,说明有些选中格子无法从起点到达,即整个选择是不连通的。反之,则连通。

让我们用DFS来实现这个逻辑,并注意一些细节:

// 方向数组,方便遍历四个邻居
int dirs[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}};

bool is_connected(int a[12]) {
    int grid[3][4];
    int start_x = -1, start_y = -1;
    int k = 0;
    
    // 步骤1: 二维化并寻找起点
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            grid[i][j] = a[k];
            if (grid[i][j] == 1 && start_x == -1) { // 找到第一个1作为起点
                start_x = i;
                start_y = j;
            }
            k++;
        }
    }
    
    // 如果没找到5个1(理论上不会),或者起点没找到,直接返回false
    if (start_x == -1) return false;
    
    // 步骤2: DFS遍历
    // 注意:为了不破坏原始数据,这里使用一个单独的visited数组或直接修改grid副本
    // 我们选择修改grid,将访问过的1置为0
    std::function<void(int, int)> dfs = [&](int x, int y) {
        if (x < 0 || x >= 3 || y < 0 || y >= 4) return; // 越界
        if (grid[x][y] != 1) return; // 不是未访问的选中格子
        
        grid[x][y] = 0; // 标记为已访问
        for (auto &d : dirs) {
            dfs(x + d[0], y + d[1]); // 递归探索四个方向
        }
    };
    
    dfs(start_x, start_y);
    
    // 步骤3: 验证是否所有1都被访问(即被置为0)
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            if (grid[i][j] == 1) { // 还有未被访问的1
                return false;
            }
        }
    }
    return true;
}

这个DFS版本清晰易懂,但有一个极其重要的细节:递归深度。网格只有12个格子,选中5个,递归深度最大为5,所以完全不用担心栈溢出问题。这是DFS在此类小规模网格问题上的优势。

4. 思维跃迁:并查集——另一种连通性判定的视角

除了DFS/BFS,并查集(Union-Find) 是处理连通性问题的另一把利器。它的思想更适合“动态连接”的场景,但用于静态判定也同样高效,且代码别具一格。

思路是这样的:我们仍然遍历所有792种组合。对于每一种组合,我们初始化一个并查集,每个选中的格子自成一个集合。然后,我们遍历所有选中的格子,对于每个格子,检查其右方和下方的邻居是否也被选中。如果选中,就将当前格子与这个邻居在并查集中合并。遍历结束后,检查所有选中格子是否属于同一个集合。如果是,则说明它们连通。

为什么只检查右方和下方?因为对于每个格子,我们检查它的右邻居和下邻居,就等价于检查了所有格子与其左邻居和上邻居的关系(避免重复检查)。这是一种常见的优化遍历手段。

class UnionFind {
private:
    vector<int> parent;
public:
    UnionFind(int n) : parent(n) {
        for (int i = 0; i < n; i++) parent[i] = i;
    }
    int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 路径压缩
        }
        return parent[x];
    }
    void unite(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            parent[rootY] = rootX;
        }
    }
    bool isConnected(int x, int y) {
        return find(x) == find(y);
    }
};

bool is_connected_unionfind(int a[12]) {
    // 将二维坐标映射为一维索引: index = i * 4 + j
    vector<int> selected;
    for (int idx = 0; idx < 12; idx++) {
        if (a[idx] == 1) {
            selected.push_back(idx);
        }
    }
    
    UnionFind uf(12); // 虽然只有5个选中,但并查集大小设为12更方便映射
    
    // 遍历所有选中的格子
    for (int idx : selected) {
        int i = idx / 4;
        int j = idx % 4;
        // 检查右邻居
        if (j + 1 < 4) {
            int right_idx = idx + 1;
            if (a[right_idx] == 1) {
                uf.unite(idx, right_idx);
            }
        }
        // 检查下邻居
        if (i + 1 < 3) {
            int down_idx = idx + 4;
            if (a[down_idx] == 1) {
                uf.unite(idx, down_idx);
            }
        }
    }
    
    // 判断所有选中格子是否在同一个集合
    int root = uf.find(selected[0]);
    for (int idx : selected) {
        if (uf.find(idx) != root) {
            return false;
        }
    }
    return true;
}

并查集方法的优势在于,其时间复杂度近乎常数,对于连通性判定非常快。虽然在本题小数据量下优势不明显,但它提供了一种不同的思维模型,对于理解连通性问题本质很有帮助。

判定方法核心思想优点缺点适用场景
DFS/BFS从一点出发,遍历所有可达点。代码直观,易于理解和实现。递归深度需注意(本题无碍)。通用性强,尤其适合路径、连通块计数等问题。
并查集逐步合并相邻元素,最后检查根节点。合并与查询效率高,适合动态连通场景。代码相对复杂,需要额外数据结构。需要多次动态连接/查询连通性的场景。

5. 性能优化与剪枝思考

尽管792种组合的枚举看起来已经是最优解(因为我们必须检查每一种可能的5格子组合),但在算法竞赛中,我们总是可以思考:有没有办法提前排除一些明显无效的组合,减少 is_connected 的调用次数?

这就是剪枝的思想。虽然对于本题,792次判断已经足够快(能在毫秒级完成),但掌握剪枝思维对解决更复杂的问题至关重要。

一个可能的剪枝思路是:连通块的数量必须为1。我们可以在DFS/BFS或并查集判定的过程中,一旦发现不连通就立刻返回 false,这本身就是一种剪枝。但有没有更前置的剪枝?

考虑一个极端情况:如果选中的5个格子都分布在网格的四个角,它们有可能连通吗?有可能,但路径非常特定。一个更通用的启发式规则是:选中的格子必须构成一个“凸”的形状,或者至少不能有“孤立”的格子。但用代码形式化这个规则比较困难。

另一种思路是基于搜索顺序的剪枝。我们在生成组合时,如果采用回溯法而非 next_permutation,可以在构造组合的过程中就进行连通性检查。例如,当我们已经选择了3个格子,如果这3个格子已经构成了两个互不连通的组件,那么无论后面再选哪2个格子,都无法使5个格子连通(因为添加的格子最多只能连接到一个组件)。这样就可以提前终止当前分支的搜索。

下面是一个回溯+DFS剪枝的思路框架(非完整代码,仅展示思想):

int grid[3][4] = {0};
int ans = 0;
int selected = 0;

void backtrack(int pos) { // pos: 当前考虑到的格子编号(0-11)
    if (selected == 5) {
        // 检查连通性
        if (is_connected_grid()) ans++;
        return;
    }
    if (pos == 12) return; // 没格子可选了
    
    // 剪枝:如果剩下的格子数 + 已选数 < 5,不可能凑够,直接返回
    if (selected + (12 - pos) < 5) return;
    
    // 剪枝(高级):如果已选格子已经形成多个连通分量,且剩余选择无法将其连接...
    // 这里需要实现一个函数来判断当前已选格子的连通分量数,实现较复杂,略。
    
    // 选择当前格子
    int i = pos / 4, j = pos % 4;
    grid[i][j] = 1;
    selected++;
    backtrack(pos + 1);
    
    // 不选择当前格子
    grid[i][j] = 0;
    selected--;
    backtrack(pos + 1);
}

这种回溯加剪枝的方法在组合数很大时优势明显,但对于本题,其代码复杂度远高于 next_permutation + 连通性判定的简洁组合。因此,在竞赛中,选择哪种方法往往取决于在代码复杂度和运行效率之间取得平衡。

6. 代码整合与最终答案

将我们讨论的最清晰、最简洁的方法组合起来:使用 next_permutation 生成所有无重复组合,使用DFS进行连通性判定。下面是完整的C++实现:

#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

int dirs[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}};

bool is_connected(int a[12]) {
    int grid[3][4];
    int start_x = -1, start_y = -1;
    int k = 0;
    
    // 映射到二维网格并找起点
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            grid[i][j] = a[k];
            if (grid[i][j] == 1 && start_x == -1) {
                start_x = i;
                start_y = j;
            }
            k++;
        }
    }
    
    // DFS遍历函数
    function<void(int, int)> dfs = [&](int x, int y) {
        if (x < 0 || x >= 3 || y < 0 || y >= 4) return;
        if (grid[x][y] != 1) return;
        grid[x][y] = 0; // 访问标记
        for (auto &d : dirs) {
            dfs(x + d[0], y + d[1]);
        }
    };
    
    dfs(start_x, start_y);
    
    // 检查是否还有未访问的1
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            if (grid[i][j] == 1) {
                return false;
            }
        }
    }
    return true;
}

int main() {
    int a[12] = {0,0,0,0,0,0,0,1,1,1,1,1}; // 初始状态,0在前,1在后
    int ans = 0;
    
    do {
        if (is_connected(a)) {
            ans++;
        }
    } while (next_permutation(a, a+12));
    
    cout << ans << endl;
    return 0;
}

运行这段代码,你会得到最终的答案:116。

这个数字就是所有不同的、连通的5张邮票剪取方法。你可以尝试手动验证一些简单情况来增强理解,比如所有5张邮票排成一条直线(横或竖)有多少种,排成一个“十”字形有多少种,但最终验证还是交给程序最可靠。

7. 举一反三:问题变体与思维扩展

掌握“剪邮票”的核心解法后,我们可以尝试挑战一些变体问题,这能极大地锻炼你的算法迁移能力。

变体1:剪下k张邮票 如果问题不是剪5张,而是剪k张(1 ≤ k ≤ 12),方法数是多少?这时,组合数会急剧增大(C(12, k)),但我们的算法框架依然适用。只需要修改初始数组 a 中1的个数即可。你可以尝试计算k从1到12的所有结果,会发现它满足一个先增后减的对称分布。

变体2:更大的网格 如果网格不是3x4,而是m x n,要剪下t个连通的格子。这时,组合数 C(m*n, t) 可能变得非常大,暴力枚举所有组合可能超时。这就需要用到更高级的搜索技巧,比如之前提到的回溯剪枝,或者状态压缩DP。这是算法竞赛中一个常见的难题方向。

变体3:计算所有连通形状 题目只要求计数,但如果要求输出所有具体的连通形状(用坐标表示),该如何修改代码?你需要在 is_connected 函数返回 true 时,将当前选中的格子坐标保存下来。注意去重,因为不同的排列可能对应同一种形状。一个去重的好方法是将选中的坐标集合进行标准化(例如排序后转换成字符串),存入 set 中。

思维扩展:从“剪邮票”到“岛屿问题” LeetCode上有大量基于网格的DFS/BFS问题,例如“岛屿数量”、“岛屿的最大面积”、“被围绕的区域”等。“剪邮票”可以看作是“寻找所有大小为k的连通岛屿”问题的一个特例。理解了这个问题的解法,再去看那些题目,你会觉得思路非常顺畅。它们的核心都是:

  1. 遍历网格。
  2. 找到一个符合条件(如值为‘1’)的起点。
  3. 从这个起点开始DFS/BFS,标记所有连通的点。
  4. 根据题目要求进行计数、面积计算或修改操作。

最后,记得在竞赛中,像“剪邮票”这类填空题,最终只需要提交一个数字答案。但它的价值远不止于此。它像一把钥匙,为你打开了一类问题的解决思路:如何将组合选取问题与图连通性判定结合起来。下次当你看到“在矩阵中选取若干个满足特定条件的格子”时,不妨想想今天讨论的生成、映射、遍历、判定的四步法,或许就能豁然开朗。

【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级) 1. 简介 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。详情见:卡尔曼滤波简介 MPU6050的解算主要有三种姿态融合算法:四元数法 、一阶互补算法和卡尔曼滤波算法。我们常用的DMP库使用的是四元数法,本文采用卡尔曼滤波算法,使用RT-Thread国产操作系统,利用env工具进行串口、模拟IIC环境配置,使用10ms的线程进行卡尔曼滤波解算。 2. 阅读详情

相关推荐

避坑指南:RK3588视频编码与SRT推流实战中,我遇到的5个典型问题及解决方案

本文深度解析RK3588平台视频编码与SRT推流实战中的五个典型问题,包括MIPI摄像头内存对齐、多线程数据传递、FFmpeg时间戳设置、SRT连接参数调优及系统资源监控。提供具体解决方案和优化技巧,帮助开发者高效实现实时视频网络传输。

weixin_28718793的博客 324

蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关

中国电子学会 12 月图形化考级报名 9/23–12/2、统考 12/12–13;全国青少年信息素养大赛 2026—2027 赛季也正处在报名与基础能力评估窗口(复赛 2027 年 5–7 月、总决赛 7–8 月,5 大主题赛项覆盖图形化)。这三大标志性赛事的图形化考点高度重合,今天用一个原创项目「校园华容道大闯关」,把。

IT_Scratch的博客 258

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 740

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:三分法求单峰函数最值解析

最近正是刷题备赛的黄金窗口:第十八届蓝桥杯软件赛报名 2026-10-08 10:00—12-18 14:00,省赛(C/C++·Python 程序设计)定在 2027-04-10 9:00–13:00;二分大家都会,但二分只能处理"单调或判定性"问题,遇到"极值"就不灵了。(加权平均 x = (3·10+1·20+4·30+2·60+5·80)/15 = 46,不舒服度 = 3·36²+1·26²+4·16²+2·14²+5·34² = 11760。——这时三分法就是"万能钥匙":只要单峰,直接搜。

IT_Scratch的博客 240

深入剖析RDMA Netlink:Linux内核中高效通信的基石

RDMA Netlink:Linux内核中高效通信控制的核心机制 RDMA技术通过绕过内核实现高速数据传输,但其管理控制仍需内核参与。drivers/infiniband/core/netlink.c文件作为RDMA子系统的心脏,构建了用户空间与内核间的高效通信桥梁。该模块采用模块化客户端架构,通过全局数组管理不同类型的RDMA功能,如设备管理、连接服务和链路层操作。从最初的全局锁到细粒度读写锁的演进,展现了Linux内核追求高性能的持续优化。同时,通过条件编译支持新旧内核版本和网络命名空间,体现了稳定性与

数字人生 239

OPTEE:TA命令操作的实现(三)

上文我们创建好了通道,现在就是操作,怎么操作TA呢?REE侧的CA执行创建会话操作成功后,CA就可使用获取到的调用来让TA执行特定的命令。通过ioctl的系统调用发送到OP-TEE的驱动中,保存在共享内存中,并触发安全监控模式调用(smc)切换到Monitor模式(ARMv7)或EL3(ARMv8)中进行安全世界状态的处理。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1268

微软技术周报 11-02~11-09:VS Code 混装 Claude 与 Codex、EF Core 11 静默改行为、.NET 11 倒计时

11 月 6 日,Power Platform 通过消息中心通知管理员,Copilot Studio、Power Automate 和 Power Apps 里所有跑在 Anthropic Claude、xAI Grok 以及旧版 GPT 上的 prompt,12 月 2 日自动迁移到 GPT-6 系列,档位价格不变,模型选择收窄到一条产品线。效果是这样的:让 Claude 评审一个 Copilot chat 写出的方案,或者把同样的任务交给 Codex,两边并排跑在同一个会话里。更要紧的是下周的时间线。

海盗Sharp的博客 825

PCL 贪婪投影三角剖分算法【2025最新版】

本博客在学习PCL中的贪婪投影三角算法的基础上,实现了使用彩色点云重建彩色模型的应用案例。博客长期更新,最近一次更新时间为:2025年7月6日。

点云侠的博客 37万+

Claude Opus 5.5 聚合平台横评:6 个入口对照官方价,按分组倍率换算成人民币

本文对比了Claude Opus 5.5在6个主流入口的价格,按输入30%、输出70%加权计算,灵眸AI最低价仅官方的33%-48%,显著低于其他平台。重点分析价格、分组兼容性(是否支持Claude Code)、缓存计费及渠道来源,建议用户根据用途选择:日常编码优先选标明“Claude Code”的分组,批量调用需确认通用SDK支持,预算敏感者可选低倍率分组但须核验渠道来源,生产环境务必确认服务条款与检测状态。

小追兵的专栏 57

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 489

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园成语接龙大挑战解析

备考季又到了——第十八届蓝桥杯 STEMA 11 月省考报名正热(,Scratch 组 90 分钟);中国电子学会报名 9 月 23 日—12 月 2 日、统考 12 月 12—13 日;也已进入报名 / 基础能力评估窗口。这三大标志性赛事的图形化考点高度重合,今天用一个原创项目「校园成语接龙大挑战」,把六件套一次性串起来,一篇顶三篇备考。

IT_Scratch的博客 453

CANape a2l文件的编辑教程

编辑a2l文件

wsq119的博客 1万+

蓝桥杯青少组图形化实战:校园俄罗斯方块解析(覆盖全国青少年信息素养大赛与电子学会图形化考级)

8 城线下测评 11 月 7 日—12 月 26 日陆续开赛,主题《星际拓荒纪元》;复赛(地区赛)定于 2027 年 5—7 月、总决赛 7—8 月,五大主题赛项覆盖图形化;报名 9/23—12/2、全国测试 12/10、统考 12/13(一级 14:00—15:00,二/三/四级 8:30—10:00)。三赛都看重「列表 + 循环 + 条件 + 变量 + 自制积木 + 广播」这套图形化基本功——下面这道原创项目题把它们一次性串起来。

IT_Scratch的博客 132

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:分块算法巧解区间改查

代码比线段树短一大截,却足以应对绝大多数区间改查题。建议蓝桥杯、电子学会 C/C++·Python 考级、信息素养大赛备赛时,把「分块」作为线段树之前的保底武器熟练掌握。今天我们用一道原创题,把「分块(Square Root Decomposition)」从思想讲到可落地的双语言实现,并拆解 7 个高频易错点。这三类赛事的算法题里,有一类「看上去用朴素模拟会超时、上线段树又觉得杀鸡用牛刀」的题目特别常见——,代码量远小于线段树,是 CSP-J/S 与蓝桥杯省赛里性价比极高的「保底利器」。

IT_Scratch的博客 106

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝桥杯 - 01背包 超通俗零基础讲解

1. dp[j] :背包容量为j时,可以装出的最大价值2. 下标 j ->代表背包体积3. dp数组里面存的值 -> 代表价值4. 举例: dp[5]=8 ,背包容量5,最多能拿到价值8。

2402_87421821的博客 287

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

蓝桥杯LV1 - 小郑的蓝桥平衡串(前缀和)

平衡串指的是一个字符串,其中包含两种不同字符,并且这两种字符的数量相等。例如,abababababab 和 aababbaababb 都是平衡串,因为每种字符各有三个,而 abaababaab 和 aaaabaaaab 都不是平衡串,因为它们的字符数量不相等。平衡串在密码学和计算机科学中具有重要应用,比如可以用于构造哈希函数或者解决一些数学问题。小郑拿到一个只包含 L、Q 的字符串,他的任务就是找到最长平衡串,且满足平衡串的要求,即保证子串中 L、Q 的数量相等。

2402_87421821的博客 475

P15434 [蓝桥杯 2025 国 Python B] 三角形构造(构造,,数学,位运算)

0时当前的y就是可以使用的,具体的做法是:由于1<=y<=x,所以直接反过来算:合法数量=x-(x&y等于0的正整数数量),现在我们考虑x&y=0,设x的二进制最高位是第h位,那么在0...h这h+1个二进制位中:x为1的位置,y必须为0,x为0的位置,y可以填0或1,假设x中0的位数是z,那么x&y=0的选择有2^z种,包括y=0.因此正整数有:2^z-1个,所以答案就是x-2^z+1,但是数据范围较大,需要开ll。等价于统计与 `x` 按位与不为0的 `y` 个数。时间复杂度:O(logx)

2501_94316951的博客 136

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析

一旦有负权边,一个“当前看起来更大”的距离,可能通过负边被后来者反超,但 Dijkstra 已经把它永久锁定了——于是答案错误。Bellman-Ford 每轮都扫全部边,很多边根本没有“被更新”,白扫。但蓝桥杯、电子学会考级里它仍是最常见的负权最短路写法,且代码短、好调试。前面我们讲过的 Dijkstra(堆优化)、Floyd、次短路、分层图最短路,都有一个共同前提——这道题的“优惠券套利”模型,在蓝桥杯里常伪装成“虫洞”“汇率兑换”“现金流”,本质都是同一套。如果存在,说明可以无限套利,输出提示即可。

IT_Scratch的博客 189

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析

蓝桥杯填空题常考带括号的四则运算,电子学会 C/C++ 考级把"栈与表达式求值"列为独立能力点,信息素养大赛的算法题也常借表达式解析建模。今天我们用一道原创题,把表达式求值从"人脑心算"打通到"栈 + 调度场算法"的完整能力链。

IT_Scratch的博客 181

蓝桥杯完全背包|和01背包对比速记

1. dp[j] :背包容量为j时,可以装出的最大价值2. 下标 j -> 背包体积3. dp里面存的值 -> 价值口诀:下标管体积,内容管价值。

2402_87421821的博客 665

蓝桥杯青少组省考(11/9报名截止·11/22开考)+电子学会图形化考级+信息素养大赛:校园极速跑酷闯关解析

速度随分数递增,挑战极限距离。(Scratch 组 10:00–11:30,90 分钟上机),准考证 11 月 18 日 14:00 起下载、成绩 12 月 4 日公布;才关门,全国测试 12 月 10 日、统考 12 月 13 日(一级 14:00–15:00、二/三/四级 8:30–10:00);今天距蓝桥杯 11 月省考报名截止只剩 4 天,想冲省考/国考、同时备考电子学会图形化考级与信息素养大赛的同学,这篇可以直接当练手题。1. 玩法完整:奔跑、起跳、躲避、计分、扣命、结束、重开,一个不少;

IT_Scratch的博客 194

B4292 [蓝桥杯青少年组省赛 2022] 路线

【代码】B4292 [蓝桥杯青少年组省赛 2022] 路线。

UIU114的博客 426

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 141

蓝桥杯DP入门——爬楼梯(一次可走1/2/3步)超详细底层推导

1. dp[i] 定义:走到第 i 级台阶的总方案数2. 最后一步只有 1、2、3步三种可能3. 递推式: dp[i] = dp[i-1] + dp[i-2] + dp[i-3]4. 初始化前3项:1、2、45. 循环从4推到n6. 结果较大,必须用 long long 防溢出。

2402_87421821的博客 524

蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园黄金矿工大挑战解析

备考季正酣——第十八届蓝桥杯全国青少年智能科技创新实践活动(原蓝桥杯青少组)省级活动 2026 年 10—12 月正在全国铺开,8 座城市省级线下测评定档 11 月 7 日至 12 月 26 日,本届主题"星际拓荒纪元",程序设计组别中的图形化创意编程分初级(U10)与中级(U14),统一 90 分钟现场上机、个人独立完成;

IT_Scratch的博客 174
上一篇: 如何在RK3588开发板上部署YOLOv5模型?从训练到推理的完整流程(附避坑指南)
下一篇: 从Rhino到Flac3D:利用Griddle插件高效构建近水平煤层开挖模型
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值