蓝桥杯2023年第十四届省赛真题-岛屿个数

文章讲述了如何利用两次深度优先搜索(DFS)和染色法在给定的二维地图中确定岛屿数量,通过扩展地图边界并进行两次DFS操作来找出独立的岛屿并计算包含子岛屿的总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目

题目描述

输入格式

输出格式

样例输入

样例输出

思路:两次DFS(染色法+合并)-Dotcpp编程社区

代码:


题目

题目描述

小蓝得到了一副大小为 M × N 的格子地图,可以将其视作一个只包含字符‘0’(代表海水)和 ‘1’(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的 ‘1’ 相连接而形成。

在岛屿 A 所占据的格子中,如果可以从中选出 k 个不同的格子,使得他们的坐标能够组成一个这样的排列:(x0, y0),(x1, y1), . . . ,(xk−1, yk−1),其中(x(i+1)%k , y(i+1)%k) 是由 (xi , yi) 通过上/下/左/右移动一次得来的 (0 ≤ i ≤ k − 1),

此时这 k 个格子就构成了一个 “环”。如果另一个岛屿 B 所占据的格子全部位于这个 “环” 内部,此时我们将岛屿 B 视作是岛屿 A 的子岛屿。若 B 是 A 的子岛屿,C 又是 B 的子岛屿,那 C 也是 A 的子岛屿。

请问这个地图上共有多少个岛屿?在进行统计时不需要统计子岛屿的数目。

输入格式

第一行一个整数 T,表示有 T 组测试数据。

接下来输入 T 组数据。对于每组数据,第一行包含两个用空格分隔的整数M、N 表示地图大小;接下来输入 M 行,每行包含 N 个字符,字符只可能是‘0’ 或 ‘1’。

输出格式

### 蓝桥杯2023第十四届真题——“奇怪的数”目解析 #### 目背景 蓝桥杯作为一项面向全国范围的技术事,其嵌入式和青少编程类别的试设计通常涵盖了基础算法、硬件外设应用以及逻辑推理等多个方面。根据已有的资料[^1],第十四届确实引入了一些较为复杂的知识点和技术模块,例如PCF8591、NE555N等硬件设备的应用。然而,“奇怪的数”这一目并未直接涉及这些硬件部分。 #### “奇怪的数”目描述 虽然具体的目原文未被完全提供,但从相关参考资料中可以推测该目可能属于数论或者序列分析范畴。假设此目的目标是从给定范围内找出满足特定条件的一系列数字,则这类问往往考察选手对于循环结构、条件判断以及数学规律的理解能力。例如,在另一道类似的蓝桥杯选拔真题中提到过一种称为“数位递增数”的概念[^3]: > 输入一个正整数 `n` (其中 $ 11 < n < 10001 $),统计并输出从11至`n`之间所有的数位严格按升序排列的自然数数量。 尽管上述例子并非本次讨论的具体目,但它展示了如何通过程序实现基于某种规则筛选符合条件的数据集的方法。 #### 可能解法思路 针对假定版本下的“奇怪的数”,以下是解决此类问的一种通用方法框架: ```cpp #include <iostream> using namespace std; bool isStrangeNumber(int num){ int prevDigit = 10; // 初始化前一位为最大值以便比较 while(num > 0){ int currentDigit = num % 10; if(currentDigit >= prevDigit){return false;} prevDigit = currentDigit; num /= 10; } return true; } int main(){ int start=11,end,n,count=0; cin>>end;// 用户输入结束数值 for(n=start;n<=end;n++){ if(isStrangeNumber(n)){ count++; } } cout<<count<<endl; } ``` 以上代码片段定义了一个辅助函数用于检测某个整数是否符合所谓的“奇怪性质”。主函数则遍历指定区间内的每一个候选者,并调用前述判定工具来累加计数器直至完成整个扫描过程。 #### 结果验证与优化建议 为了提高效率,还可以考虑采用动态规划或者其他高级技巧减少重复计算量。另外值得注意的是实际比中可能会存在边界情况处理不当而导致错误得分的情况发生因此务必仔细审阅样例说明确保覆盖全面[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值