第十四届蓝桥杯省赛C++B组F题【岛屿个数】题解(AC)

news2024/11/28 12:49:50

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意

给定一个 01 地图,分别表示陆地,问地图中一共有多少块岛屿?另外,若一个岛屿在另一个岛屿的内部,则不统计。如下图中的大岛屿包含着内部的小岛屿,故内部小岛屿不计算,最终输出 1

11111
10001
10101
10001
11111

解题思路

我们先来考虑一下 Easy Version,倘若单纯求岛屿的个数,可以直接遍历整个地图,若找到一块地,就是一个岛屿,然后将该岛屿清除(标记或改将该岛改为海)。

那么本题该如何做呢?

  1. 将在所有为岛 A A A 内的岛 B B B 全部清除,那么就转化为了上述 Easy Version
  2. 将在岛 A A A 内的岛 B B B 与岛 A A A 视为同一个岛屿,那么就转化为了上述 Easy Version

我们考虑上述第 2 2 2 点,如果我们要将一个岛屿和其内部的岛屿都视为一个整体,那么不妨将内部的海也视为一个整体,那么这个内海,就和原本地图上的外海不一致,所以我们可以考虑,将地图上的所有外海设为字符 2

那么如何将判断地图中的海是内海还是外海,如何清除?

我们可以在地图周围都围上一圈的 0,这个一定是外海,且联通着所有外海,并用八联通进行扩展。

假设原地图为:

11111
10001
10001
10001
11111

扩展后可得到

2222222
2111112
2100012
2100012
2100012
2111112
2222222

假设原地图为:

11111
10001
10001
10001
11110

扩展后可得到

2222222
2111112
2122212
2122212
2122212
2111122
2222222

八联通扩展,可以将有缝隙的岛渗透进入标记外海,而无缝隙的岛屿即为一整个岛屿(含内岛和内海)。

那么接下来统计岛屿个数,用 DFS 进行扩展即可。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 55;

int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

int n, m;
char g[N][N];

void dfs1(int x, int y)
{
    g[x][y] = '2';
    for (int i = x - 1; i <= x + 1; ++ i )
        for (int j = y - 1; j <= y + 1; ++ j )
            if (i >= 0 && i <= n + 1 && j >= 0 && j <= m + 1 && g[i][j] == '0')
                dfs1(i, j);
}

void dfs2(int x, int y)
{
    g[x][y] = '2';
    for (int i = 0; i < 4; ++ i )
    {
        int tx = x + dx[i], ty = y + dy[i];
        if (tx < 0 || tx > n + 1 || ty < 0 || ty > m + 1 || g[tx][ty] == '2')
            continue;
        dfs2(tx, ty);
    }
}

int main()
{
    int T;
    cin >> T;
    
    while (T -- )
    {
        cin >> n >> m;
        for (int i = 1; i <= n; ++ i )
            cin >> g[i] + 1;
        for (int i = 0; i <= n + 1; ++ i )
            g[i][0] = g[i][m + 1] = '0';
        for (int j = 0; j <= m + 1; ++ j )
            g[0][j] = g[n + 1][j] = '0';
        
        dfs1(0, 0);
        
        int res = 0;
        for (int i = 1; i <= n; ++ i )
            for (int j = 1; j <= m; ++ j )
                if (g[i][j] == '1')
                    dfs2(i, j), res ++;
        
        cout << res << endl;
    }
    
    return 0;
}

【在线测评】

在这里插入图片描述

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

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

相关文章

10种有效提高电子设备可靠性的PCB散热技术

在现代电子领域&#xff0c;随着器件尺寸的不断缩小和性能的不断提高&#xff0c;热管理问题日益凸显&#xff0c;不容忽视。电子设备在运行过程中产生的热量&#xff0c;如果处理不当&#xff0c;散发不了&#xff0c;就会像潜移默化的威胁一样&#xff0c;悄无声息地危及设备…

交换数字00

题目链接 交换数字 题目描述 注意点 numbers.length 2-2147483647 < numbers[i] < 2147483647 解答思路 不适用临时变量&#xff0c;可以先将numbers[0]和numbers[1]的信息都存到某个位置&#xff08;可以相加可以相减或其他位操作&#xff09;&#xff0c;然后另一…

Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码

目录 一、主要内容 二、部分代码 三、运行结果 四、下载链接 一、主要内容 该程序为《基于改进鲸鱼优化算法的微网系统能量优化管理》源码&#xff0c;主要内容如下&#xff1a; 针对包含多种可再生能源的冷热电联供型微网系统的能量优化问题&#xff0c;为了优化其运行过程…

7-google::protobuf::io命名空间下常用的C++ API----zero_copy_stream_impl.h

一、protobuf输入输出文件流C API总览 二、经常会用到的API

风电升压站3d动画演示定制确保每一名职工都能够安全、健康地工作

海上风电工程建设包括大量的吊装作业、架空作业、埋设作业以及电气作业&#xff0c;涉及面广&#xff0c;风险较高&#xff0c;因此在技能培训上需要格外重视&#xff0c;基于VR安全培训的广泛应用&#xff0c;企业逐渐开始引进VR虚拟仿真技术&#xff0c;利用视觉、听觉和亲身…

深度解读:Etched Sohu与Groq LPU芯片的区别

本文简单讲解一下Etched Sohu与Groq LPU两种芯片的区别。 设计理念的差异 首先&#xff0c;这两款产品在设计理念上完全是两条不同的路线。Etched Sohu芯片的设计理念是围绕Transformer模型进行优化。Transformer模型近年来在NLP任务中表现出色&#xff0c;Etched公司因此为其…

从数据到智能,英智私有大模型助力企业实现数智化发展

在数字化时代&#xff0c;数据已经成为企业最重要的资源。如何将这些数据转化为实际的业务价值&#xff0c;是每个企业面临的重要课题。英智利用业界领先的清洗、训练和微调技术&#xff0c;对企业数据进行深度挖掘和分析&#xff0c;定制符合企业业务场景的私有大模型&#xf…

#Vue 3 + ts + antd table表格的使用(嵌套 子表格版)

1. 嵌套子表格的使用 <template><a-table :columns"columns" :data-source"data" class"components-table-demo-nested"><template #bodyCell"{ column }"><template v-if"column.key operation">…

论文写作全攻略:Kimi辅助下的高效学术写作技巧

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 完成论文写作是一个多阶段的过程&#xff0c;涉及到不同的任务和技能。以下是按不同分类总结的向Kimi提问的prompt&#xff0c;以帮助你在论文写作过程中取得成功&#xff1a; 1. 选题与…

Redis 7.x 系列【19】管道

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 往返时间2. 管道技术3. 代码演示4. 其他批处理4.1 原生批处理命令4.2 事务4.3 脚本…

华大基因乌拉圭实验室启航:中国技术赋能拉美精准医学发展

乌拉圭作为加入“一带一路”倡议的国家&#xff0c;多年来&#xff0c;与中国在经贸、教育、文化和科技等多个关键领域的合作不断深化与拓展。随着“共建‘健康丝绸之路’倡议”的深化落实&#xff0c;中乌两国在医疗卫生领域的合作也迈入了新阶段。作为中国基因行业的奠基者&a…

大型能源电力集团需要什么样的总部数据下发系统?

能源电力集团的组织结构是一个复杂的系统&#xff0c;包括多个职能部门和子分公司。这些子分公司负责具体的电力生产、销售、运维等业务。这些部门和公司协同工作&#xff0c;确保电力生产的顺利进行&#xff0c;同时关注公司的长期发展、市场拓展、人力资源管理、财务管理和公…

C#实战|账号管理系统:通用登录窗体的实现。

哈喽,你好啊,我是雷工! 本节记录登录窗体的实现方法,比较有通用性,所有的项目登录窗体实现基本都是这个实现思路。 一通百通,以下为学习笔记。 01 登录窗体的逻辑 用户在登录窗输入账号和密码,如果输入账号和密码信息正确,点击【登录】按钮,则跳转显示主窗体,同时在固…

属性描述符初探——Vue实现数据劫持的基础

目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么&#xff1f; ​编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…

Node之Web服务

前言 本文将讲解node的web服务 通过讲解http请求&#xff0c;node创建web服务等知识点让你更加深入的理解web服务和node创建的web服务 HTTP请求是什么&#xff1f; HTTP请求是客户端&#xff08;通常是浏览器或其他应用程序&#xff09;与服务器之间进行通信的一种方式。 …

onclick和@click有什么区别,究竟哪个更好使?

哈喽小伙伴们大家好,我是爱学英语的程序员,今天来给大家分享一些关于vue中事件绑定相关的内容,希望对大家有所帮助. 场景是这样的:我要实现一个切换栏,默认激活的是第一个标签,当鼠标移动到第二个标签是,对应的内容让激活.起初,我第一时间想到的是用element plus的组件来实现这…

从“NLP技术”到“AI大模型”

自从AI大模型问世以来&#xff0c;仿佛很少有人提及NLP技术这个词了。昨天休息的时候突然在想一个问题&#xff0c;AI大模型已经如此强大了&#xff0c;还需要传统的NLP技术吗&#xff1f; 传统的NLP技术指&#xff1a;从分词&#xff08;ws&#xff09;、词性标注&#xff08;…

【半导体行业推荐】PFA酸纯化器 特氟龙材质 酸蒸馏仪

PFA酸纯化器是一种实验室设备&#xff0c;专门用于制备高纯度的酸&#xff0c;这些高纯酸在化学分析、材料科学、半导体制造、光伏产业、生物医学研究等领域有着重要应用。以下是PFA酸纯化器的一些关键特性和功能&#xff1a; 1. 高效提纯&#xff1a;PFA酸纯化器通过先进的膜…

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…

Twitter批量发送消息api接口如何申请配置?

Twitter批量发送消息API接口的功能&#xff1f;接口有哪些限制&#xff1f; 企业和开发者越来越多地需要在Twitter上批量发送消息。然而&#xff0c;申请和配置这个接口需要一定的步骤和注意事项。AokSend将详细介绍如何申请和配置Twitter批量发送消息API接口。 Twitter批量发…