[蓝桥杯] 岛屿个数(C语言)
提示: 橙色字体为需要注意部分,红色字体为难点部分,会在文章“重难点解答”部分精讲。
题目链接
蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网
题目理解
这道题让我们求岛屿个数,那么我们就应该先弄懂,对于一个岛的定义是什么。(我当时就因为没弄明白这个困扰很久,所以会将细一点)
让我们直观感受下:


上图所示情形是一个岛,因为外面有了一圈陆地将里面的小陆地包围了起来,你可以想象成海岛中的池子中有一块大石头(右边的图是我p的,是丑了点,主要为了便于理解)。
而如果是以下情形,就变成了两个岛:

你可以理解为海水流动性更强,而海岛的岩石又不可能衔接的严丝合缝。海水从那个缺口的地方流了进去,因此中间小块陆地并没有被外圈陆地包围,这种情况下是两个岛。
那么不难理解题目当中给出的第二组示例为什么是3个岛了吧?

话不多说,我们继续向下进行。
解题思路
1.核心思想
我们用题目给出的第二组用例来讲,如下呢就是地图。

然后我们以(0,0)为起点使用dfs将外海全部标记为2,为了确保(0,0)是外海且外海是相通的(方便dfs展开),我们将地图外部扩展一圈0。

dfs展开,将外海全部标记为2

完成

然后对全图进行查找,如果有满足标记为‘1’的陆地且与外海相邻,对其进行dfs展开,标记为3。每进行一次dfs,岛屿个数就加1。

2.具体做法
这段代码的思路是通过深度优先搜索(DFS)来解决问题。下面是代码的详细解释:
-
首先,定义了一个二维数组
map来表示地图,其中map表示格子的状态。0表示海洋,1表示未标记的陆地,2表示已标记的海洋,3表示已标记的陆地。 -
接下来,定义了两个递归函数
dfs_sea和dfs_island,用于进行深度优先搜索。 -
dfs_sea函数用于将外海的格子标记为2。从给定的坐标(0, 0)开始,如果当前格子是未访问的海洋(即map[x][y] == 0),则将其标记为2,并递归调用dfs_sea函数对周围的8个格子进行展开。 -
dfs_island函数用于将与外海相连的未标记的陆地格子标记为3。从给定的坐标(j, k)开始,如果当前格子是未标记的陆地且该格子的上一个(上下左右都可以,我这里用的是上)格子为外海(即(1==map[j][k])&&(2==map[j-1][k])),则将其标记为3,并递归调用dfs_island函数对周围的4个格子进行展开。 -
接下来,将二维数组
map全部初始化为0。 -
调用
dfs_sea函数,从坐标(0, 0)开始,将外海的格子标记为2。 -
接下来,使用嵌套循环遍历地图的每个格子,如果某个格子是未标记的陆地且与外海相连(即当前格子为1,上方格子为2),则调用
dfs_island函数对该陆地进行标记,并将计数器count加1。 -
最后,输出计数器
count的值,表示与外海相连的未标记陆地的数量。
完整代码
#include<stdio.h>
int m,n,map[52][52];
void dfs_sea(int x,int y)
{if((x>=0&&x<=m+1)&&(y>=0&&y<=n+1)){if(0==map[x][y])//海水是周围8块进行展开{map[x][y]=2;dfs_sea(x,y+1);dfs_sea(x,y-1);dfs_sea(x+1,y);dfs_sea(x+1,y+1);dfs_sea(x+1,y-1);dfs_sea(x-1,y);dfs_sea(x-1,y+1);dfs_sea(x-1,y-1);}}
}
void dfs_island(int x,int y)
{if((x>=0&&x<=m+1)&&(y>=0&&y<=n+1)){if(1==map[x][y])//陆地是周围4块进行展开{map[x][y]=3;dfs_island(x+1,y); dfs_island(x-1,y); dfs_island(x,y+1);dfs_island(x,y-1);}}
}
main()
{int number;scanf("%d",&number);for(int i=0;i<number;i++){int count=0;scanf("%d%d",&m,&n);for(int j=0;j<=m+1;j++)//将数组全部初始化为0{for(int k=0;k<=n+1;k++){map[j][k]=0;}}for(int j=1;j<=m;j++)//输入地图{for(int k=1;k<=n;k++){scanf("%1d",&map[j][k]);/*‘%1d’的含义为输入长度为1的整形,如果不限制长度则‘11101’会被当场一个数据,而不是5个数据*/}}dfs_sea(0,0); //从(0,0)处进行dfs,将外海全部标记为数字2for(int j=1;j<=m;j++){ for(int k=1;k<=n;k++){if((1==map[j][k])&&(2==map[j-1][k]))
/*当某坐标是未标记过的陆地且其与外海相连,对其dfs*/{dfs_island(j,k);count++;}}}printf("%d\n",count);}
}
重难点解答
为什么海水8方展开,陆地4方展开
如果在这里有问题,应该回去再看一下题目理解部分。因为海水可以从陆地的缝隙流过去,也就是说海水可以斜着进行扩散,而陆地却只能上下左右展开。
———(如有问题,欢迎评论区提问)———
相关文章:
[蓝桥杯] 岛屿个数(C语言)
提示: 橙色字体为需要注意部分,红色字体为难点部分,会在文章“重难点解答”部分精讲。 题目链接 蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 题目理解 这道题让我们求岛屿个数,那么我们就应该先弄懂,对于一…...
Apache Storm的详细配置
Apache Storm的详细配置主要涉及以下几个方面: Zookeeper配置:Apache Storm使用Zookeeper来进行协调和配置管理。你需要配置Zookeeper集群的连接信息,包括Zookeeper服务器的主机和端口。 Storm Nimbus配置:Nimbus是Storm的主节点,负责分配任务给各个工作节点。你需要配置N…...
kylin v10 php源码安装后配置nginx
银河麒麟V10 源码编译安装php7.4 下载地址 https://www.php.net/distributions/php-7.4.33.tar.xz 安装依赖包,准备编译 dnf install libxml2-devel sqlite-devel bzip2-devel libcurl-devel libjpeg-turbo-devel freetype-devel openldap-devel libtool-devel p…...
【01背包】滚动数组优化实现一维01背包DP(对比朴素写法)
01背包 代码 背包问题的滚动数组优化版本建议在完全弄懂了普通的二维01背包问题后再进行食用,不然会出现消化不良的症状… 我们可以将背包问题中DP数组的下标看作成两个集合 下面对比两种不同实现方法的区别: 朴素二维DP版本 使用dp[不超过i的物品集合]…...
深度学习500问——Chapter07:生成对抗网络(GAN)(2)
文章目录 7.2 GAN的生成能力评价 7.2.1 如何客观评价GAN的生成能力 7.2.2 Inception Score 7.2.3 Mode Score 7.2.5 Wasserstein distance 7.2.6 Frchet Inception Distance (FID) 7.2.7 1-Nearest Neighbor classifier 7.2.8 其他评价方法 7.3 其他常见的生成式模型有哪些 7.…...
A13 STM32_HAL库函数 之 HAL-ETH通用驱动 -- B -- 所有函数的介绍及使用
A13 STM32_HAL库函数 之 HAL-ETH通用驱动 -- B -- 所有函数的介绍及使用 1 通用定时器(TIM)预览1.11 HAL_ETH_TxCpltCallback1.12 HAL_ETH_RxCpltCallback1.13 HAL_ETH_ErrorCallback1.14 HAL_ETH_ReadPHYRegister1.15 HAL_ETH_WritePHYRegister1.16 HAL…...
Qotom Q720G5英特尔赛扬处理器N4000高性价比无风扇迷你电脑5网口软路由防火墙
在数字时代,迷你电脑已经成为高效、灵活的解决方案,无论是个人用户还是企业用户,都能从中受益。Qotom Q720G5 无风扇迷你电脑就是这样一款强大的选择,它不仅可以作为软路由、防火墙和路由器,还有着更多的潜力等待发掘。…...
如何了解数字化和信息化的区别?
在数字化浪潮席卷全球的今天,企业如何乘风破浪、实现转型升级? 数字化和信息化,这两个看似相似却各有千秋的概念,一直被人们拿来对比。 下面就来讲一讲我的理解: 从简单了说: “信息化”可以理解为传统数…...
CTF-SHOW SSRF
web351 存在一个flag.php页面,访问会返回不是本地用户的消息,那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议,之后判断我们传入的url中是否含有localhost和127.0.0,如果没有则…...
客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题
客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题 问题演示第1种:客户端以URL拼接的方式传值第2种:客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决(全局解…...
【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?
一、堆和栈的定义 (1)堆(Heap) 数据结构:堆是一种特殊的完全二叉树,满足父节点的值总是大于或等于(大根堆)其子节点的值。也可以是总是小于或等于(小根堆)其…...
5-云原生监控体系-Grafana-使用配置文件实现自动化导入Dashboard
文章目录 1. 介绍(此文档使用的版本 grafana-enterprise-10.0.3-1)2. 清空之前的实验数据3. 使用配置文件方式配置 Datasource3.1. 创建配置文件3.2. 重启服务并检查是否生效4. 使用配置文件方式配置 Dashboard4.1. 创建配置文件5. 配置 Dashboard JSON 文件5.1. 下载 JSON 文…...
Ollama、FastGPT大模型RAG结合使用案例
参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…...
夯实智慧新能源数据底座,TiDB Serverless 在 Sandisolar+ 的应用实践
本文介绍了 SandiSolar通过 TiDB Serverless 构建智慧新能源数据底座的思路与实践。作为一家致力于为全球提供清洁电力解决方案的新能源企业,SandiSolar面临着处理大量实时数据的挑战。为了应对这一问题,SandiSolar选择了 TiDB Serverless 作为他们的数据…...
MySQL数据库max_allowed_packet参数
如上图所示的报错,我在提交接口的时候出现了这个错误: MySqlConnector.MySqlException:Error submitting 4MB packet;ensure max_allowed_packet is greater than 4MB.在MySQL数据库中,有一个参数叫max_allowed_packet,这个参数会…...
Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露
目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点: 1、云原生-K8s安全-etcd未…...
JUC下面常见的锁
这里写目录标题 1、ReentrantLock2、Semaphore3、CountDownLatch4、CyclicBarrier 1、ReentrantLock ReentrantLock 是属于独占模式, 即同一时刻只允许一个线程获取锁。 2、Semaphore Semaphore 属于共享模式,synchronized 和 ReentrantLock 都是一次只…...
Uniapp+基于百度智能云完成AI视觉功能(附前端思路)
本博客使用uniapp百度智能云图像大模型中的AI视觉API(本文以物体检测为例)完成了一个简单的图像识别页面,调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…...
Android 软件盘的弹出和消失的监听
监听接口 OnKeyboardListener.java public interface OnKeyboardListener {void onKeyboardHidden();void onKeyboardShow(int keyboardHeight);} KeyBoardUtil.java public class KeyBoardUtil {private final static String TAG "KeyBoardUtil";public PopupWi…...
通俗易懂HTTP和HTTPS区别
HTTP:超文本传输协议,它是使用一种明文的方式发送我们的内容,没有任何的加密,例如我们要在网页上输入账号密码,如果使用HTTP协议,账号密码就可能会被暴露,默认端口是80. HTTPS:是HT…...
stm32开发新手福音:告别复杂安装,用快马ai生成带详解的hal库基础代码
作为一名刚接触STM32开发的新手,我最近在尝试用HAL库控制GPIO时遇到了不少麻烦。从下载安装STM32CubeMX到配置工程,每一步都让我这个小白手忙脚乱。直到发现了InsCode(快马)平台,整个过程变得简单多了——不需要自己搭建环境,AI就…...
程序员巫术:用玩偶诅咒删库的同事
——软件测试从业者的专业反思与健康应对在软件开发的战场上,测试工程师常被视为“质量守门人”,肩负着拦截缺陷、守护产品稳定的重任。然而,当一位愤怒的测试员掏出针线缝制玩偶,试图用“巫术”诅咒那位鲁莽删库的同事时…...
DFS经典例题(八皇后,数独)
1.1P1036 [NOIP 2002 普及组] 选数 解题思路 这里是组合思想与元素的排序无关,列举出所有符合的组合再判断是否符合素数 代码 #include<iostream> using namespace std; const int N 21; int a[N]; int path; int ret; int n, m;bool is(int path) {if (pa…...
MCP服务器性能翻倍的秘密:基于asyncio+uvloop+Pydantic V2的轻量级模板(压测QPS达12,800+)
第一章:MCP服务器开发模板概述与核心价值MCP(Model-Controller-Protocol)服务器开发模板是一套面向协议驱动、可插拔架构的后端服务构建范式,专为高并发、多协议适配(如HTTP/2、gRPC、WebSocket、MQTT)场景…...
nanomsg性能基准测试终极指南:不同消息大小下的吞吐量对比分析
nanomsg性能基准测试终极指南:不同消息大小下的吞吐量对比分析 【免费下载链接】nanomsg nanomsg library 项目地址: https://gitcode.com/gh_mirrors/na/nanomsg nanomsg是一个轻量级、高性能的消息传递库,专为解决常见的通信模式而设计。作为na…...
如何用Blade框架实现高效事件驱动架构:异步处理与消息队列终极指南
如何用Blade框架实现高效事件驱动架构:异步处理与消息队列终极指南 【免费下载链接】blade :rocket: Lightning fast and elegant mvc framework for Java8 项目地址: https://gitcode.com/gh_mirrors/bl/blade Blade是一款基于Java8的轻量级MVC框架…...
MelonLoader终极指南:3分钟掌握Unity游戏模组加载器完整使用技巧
MelonLoader终极指南:3分钟掌握Unity游戏模组加载器完整使用技巧 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader Me…...
3步精通n8n浏览器自动化:从安装到流程编排
3步精通n8n浏览器自动化:从安装到流程编排 【免费下载链接】n8n-nodes-puppeteer n8n node for requesting webpages using Puppeteer 项目地址: https://gitcode.com/gh_mirrors/n8/n8n-nodes-puppeteer n8n-nodes-puppeteer是一款专为n8n平台开发的浏览器控…...
JAVA重点基础、进阶知识及易错点总结(1)---数据类型、运算符、流程控制
🚀 Java 巩固进阶 第1天 主题:数据类型、运算符与流程控制 —— 避开那些“隐形”的坑📅 进度概览:重启Java基础。 💡 核心价值:很多生产环境的Bug(如金额精度丢失、空指针崩溃、逻辑穿透&…...
道心网络安全学习笔记系列之好靶场的信息收集2
上节课找了一个图片的网址,继续挑战其它靶场,我们看下一题收集十个百度域名,这还不是顺手就来,但是贴吧不行,那还不简单,去访问百度网站,顺便输入一个搜索词,都不用看,前…...
