[蓝桥杯] 岛屿个数(C语言)

news2024/11/27 10:44:37

    提示: 橙色字体为需要注意部分,红色字体为难点部分,会在文章“重难点解答”部分精讲。

题目链接

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

题目理解 

        这道题让我们求岛屿个数,那么我们就应该先弄懂,对于一个岛的定义是什么。(我当时就因为没弄明白这个困扰很久,所以会将细一点)

        让我们直观感受下:

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

        而如果是以下情形,就变成了两个岛

        你可以理解为海水流动性更强,而海岛的岩石又不可能衔接的严丝合缝。海水从那个缺口的地方流了进去,因此中间小块陆地并没有被外圈陆地包围,这种情况下是两个岛。

        那么不难理解题目当中给出的第二组示例为什么是3个岛了吧?

        话不多说,我们继续向下进行。

解题思路 

1.核心思想

        我们用题目给出的第二组用例来讲,如下呢就是地图。

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

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

         完成

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

2.具体做法 

这段代码的思路是通过深度优先搜索(DFS)来解决问题。下面是代码的详细解释:

  1. 首先,定义了一个二维数组map来表示地图,其中map表示格子的状态。0表示海洋,1表示未标记的陆地,2表示已标记的海洋,3表示已标记的陆地。

  2. 接下来,定义了两个递归函数dfs_seadfs_island,用于进行深度优先搜索。

  3. dfs_sea函数用于将外海的格子标记为2。从给定的坐标(0, 0)开始,如果当前格子是未访问的海洋(即map[x][y] == 0),则将其标记为2,并递归调用dfs_sea函数对周围的8个格子进行展开

  4. dfs_island函数用于将与外海相连的未标记的陆地格子标记为3。从给定的坐标(j, k)开始,如果当前格子是未标记的陆地且该格子的上一个(上下左右都可以,我这里用的是上)格子为外海(即(1==map[j][k])&&(2==map[j-1][k]),则将其标记为3,并递归调用dfs_island函数对周围的4个格子进行展开

  5. 接下来,将二维数组map全部初始化为0。

  6. 调用dfs_sea函数,从坐标(0, 0)开始,将外海的格子标记为2。

  7. 接下来,使用嵌套循环遍历地图的每个格子,如果某个格子是未标记的陆地且与外海相连(即当前格子为1,上方格子为2),则调用dfs_island函数对该陆地进行标记,并将计数器count加1。

  8. 最后,输出计数器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,将外海全部标记为数字2
		for(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方展开

        如果在这里有问题,应该回去再看一下题目理解部分。因为海水可以从陆地的缝隙流过去,也就是说海水可以斜着进行扩散,而陆地却只能上下左右展开。

———(如有问题,欢迎评论区提问)———

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R: 支持向量机(Support Vector Machine,简称SVM)

在数据科学和机器学习领域中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种强大的监督学习算法&#xff0c;常用于分类和回归分析。它的优点之一是可以适用于复杂的数据集&#xff0c;并且在高维空间中表现良好。在本文中&am…

SpringBoot3 + Vue3 + Uniapp + uView + Elenment 实现动态二级分类以及二级分类的管理

SpringBoot3 Vue3 Uniapp uView Elenment 实现动态二级分类以及二级分类的管理 1. 效果展示1.1 前端显示效果1.2 后台管理一级分类1.3 后台管理二级分类 2. 后端代码2.1 GoodsCategoryController.java2.2.1 GoodsCategoryMapper.java2.2.2 GoodsCategorySonMapper.java2.3.…

蓝桥杯备赛(C/C++组)

README&#xff1a; 本笔记是自己的备考笔记&#xff0c;按照官网提纲进行复习&#xff01;适合有基础&#xff0c;复习用。 一、总考点 试题考查选手解决实际问题的能力&#xff0c;对于结果填空题&#xff0c;选手可以使用手算、软件、编程等方法解决&#xff0c;对于编程大…

Laravel 11入门:使用ServBay打造高效开发环境

Laravel 11发布&#xff0c;改进了不少功能。 它引入了更加流畅的应用结构、每秒限速、健康路由等特性。 此外&#xff0c;Laravel还推出了第一方可扩展的WebSocket服务器Laravel Reverb&#xff0c;为你的应用提供强大的实时功能。 在今天的指南中&#xff0c;我将设置一个…

OSPF中配置VLAN通信(单臂路由)

OSPF中配置VLAN通信&#xff08;单臂路由&#xff09; 单臂路由&#xff08;One-Arm Routing&#xff09;是一种网络路由配置方式&#xff0c;常用于解决网络中的特定问题。在传统的网络架构中&#xff0c;路由器通常需要连接到多个子网或网络段&#xff0c;每个子网都需要一个…

项目管理工具——使用甘特图制定项目计划的详细步骤

甘特图是一种直观的项目管理工具&#xff0c;它有助于我们清晰地展示任务安排、时间管理和项目的进度。以下是使用甘特图制定项目计划的详细步骤&#xff1a; 1、创建项目&#xff1a;首先&#xff0c;在进度猫中创建新的项目&#xff0c;并设置项目的时间、工作日等参数。根据…

test4132

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

14届蓝桥杯 C/C++ B组 T6 岛屿个数 (BFS,FloodFill,填色)

首先拿到这道题不要想着去直接判断环里面的岛屿&#xff0c;这样太困难了&#xff0c;我们可以使用之前做过的题的经验&#xff0c;在输入加入一圈海水&#xff0c;然后从(0,0)点开始BFS&#xff0c;这里进行八向搜索&#xff0c;搜到的0全部都染色成2&#xff0c;假如2能够蔓延…

GEE数据集——巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年)

简介 巴基斯坦国家级土壤侵蚀数据集&#xff08;2005 年和 2015 年&#xff09; 该数据集采用修订的通用土壤流失方程 (RUSLE)&#xff0c;并考虑了六个关键影响因素&#xff1a;降雨侵蚀率 (R)、土壤可侵蚀性 (K)、坡长 (L)、坡陡 (S)、覆盖管理 (C) 和保护措施 (P)&#xff…

机器人瓶胚检测工作站(H3U脉冲轴控制)

1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要&#xff0c;下面我们讨论下安全联锁控制逻辑

C++设计模式|0.前言

1.什么是设计模式&#xff1f; 简答来说&#xff0c;设计模式就是一套好用的代码经验总结&#xff0c;也就是怎么写好代码的方法论。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。 2.设计模式的分类 设计模式可以分为三类&#xff1a;创建型、…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

Vivado Design Suite中的Routing消息与Intermediate Route结果

在Vivado Design Suite中&#xff0c;优化后的Routing消息和Intermediate Route 结果保存在工程文件中的runs\impl_1中的runme.log文件。 一、Routing消息 当路由器由于拥塞或修复过多的保持时间违规而难以达到时序目标时&#xff0c;Routing消息会提供有用的消息。路由器在努力…

Training - PyTorch Lightning 的 Horovod 策略实践 (all_gather)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137686312 在 PyTorch Lightning 中使用 Horovod 策略&#xff0c;可以在多个 GPU 上并行训练模型。Horovod 是分布式训练框架&#xff…

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

前端重置表单的多个Demo

目录 前言1. 纯重置2. reset重置3. resetFields重置4. 彩蛋 前言 由于从Java转全栈&#xff0c;对于前端的相关知识目前 以点科普面&#xff0c;此处的总结 重置前端表单内容&#xff0c;防止影响后续操作 其基本知识只需要通过点击按钮触发重置表单 1. 纯重置 可以通过按钮…

Golang | Leetcode Golang题解之第24题两两交换链表中的节点

题目&#xff1a; 题解&#xff1a; func swapPairs(head *ListNode) *ListNode {dummyHead : &ListNode{0, head}temp : dummyHeadfor temp.Next ! nil && temp.Next.Next ! nil {node1 : temp.Nextnode2 : temp.Next.Nexttemp.Next node2node1.Next node2.Nex…

一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

项目实训2024.04.12日志:Self-QA生成问答对

1. Self-QA技术 1.1. 为什么要用Self-QA技术 关于为什么要搜集问答对&#xff0c;我在创新实训2024.04.07日志&#xff1a;提取QA对这篇文章中提到过&#xff1a;训练大模型需要从业务侧积累的问题、资料、文档中提取出一些指令-问答对作为输入的语料。 之前我们对于问答对的…

Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/ 输入 http://127.0.0.1:8000/main/index 路由定义情况 urlpatterns [path("index/", views.index) ]可以发现我在输入URL的index路由时&#xff0c;如果没有和Django定义的路由匹配规则一样的话&#xff0c;浏览器自…