【洛谷 P8662】[蓝桥杯 2018 省 AB] 全球变暖 题解(深度优先搜索+位集合)

[蓝桥杯 2018 省 AB] 全球变暖

题目描述

你有一张某海域 N × N N \times N N×N 像素的照片,. 表示海洋、 # 表示陆地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中 “上下左右” 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 2 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入格式

第一行包含一个整数 N N N ( 1 ≤ N ≤ 1000 ) (1 \le N \le 1000) (1N1000)

以下 N N N N N N 列代表一张海域照片。

照片保证第 1 1 1 行、第 1 1 1 列、第 N N N 行、第 N N N 列的像素都是海洋。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

7 
.......
.##....
.##....
....##.
..####.
...###.
.......

样例输出 #1

1

提示

时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛


思路

首先,定义一个二维数组m1来存储海洋和陆地的地图,其中海洋用.表示,陆地用#表示。然后,定义一个二维数组vis来存储每个位置是否已经访问过。

在主函数中,首先读取地图的大小n,然后读取地图。接着,通过DFS统计原始地图中岛屿的数量,存储在begin中。随后,执行淹没操作,模拟全球变暖后海洋上升,陆地被淹没的情况。最后,再次通过DFS统计淹没后剩下的岛屿数量,存储在end中。最后,输出被完全淹没的岛屿数量,即begin - end

在DFS过程中,定义了两个函数:cntIssubmergecntIs函数用于统计岛屿数量,submerge函数用于模拟陆地被淹没的过程。每次DFS前,都需要重置访问数组vis,以防止重复访问。

cntIs函数中,首先检查当前位置是否访问过或者是否为海洋,如果是,则直接返回。然后,设置当前位置已访问,并检查当前位置是否为陆地。接着,遍历当前位置的四个方向,如果邻居是陆地,则递归调用cntIs函数。

submerge函数中,首先检查当前位置是否访问过或者是否为海洋,如果是,则直接返回。然后,设置当前位置已访问。接着,遍历当前位置的四个方向,如果邻居是海洋,则将当前位置标记为淹没,并退出循环。如果当前位置被淹没,则遍历其四个方向,如果邻居是陆地,则递归调用submerge函数。

注意

需要将被淹没的陆地标记为其他字符(这里将被淹没的陆地标记为了*)。否则,如果在海平面上升过程中,某个大岛被部分淹没后,分裂成几个小岛,会出现海平面上升后的岛屿数量比上升前的多,导致答案出现负数。


AC代码

#include <algorithm>
#include <bitset>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e3 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};int n;
char m1[N][N];bitset<N> vis[N];void resetVis() {for (int i = 1; i <= n; i++) {vis[i].reset();}
}bool cntIs(int x, int y) {if (vis[x][y] || m1[x][y] == '.') {return 0;}vis[x][y] = 1;bool flg = (m1[x][y] == '#');for (int i = 0; i < 4; i++) {int x1 = x + dir[i][0];int y1 = y + dir[i][1];if (1 <= x1 && x1 <= n && 1 <= y1 && y1 <= n && m1[x1][y1] != '.') {flg |= cntIs(x1, y1);}}return flg;
}// 如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
void submerge(int x, int y) {if (vis[x][y] || m1[x][y] != '#') {return;}vis[x][y] = 1;for (int i = 0; i < 4; i++) {int x1 = x + dir[i][0];int y1 = y + dir[i][1];if (1 <= x1 && x1 <= n && 1 <= y1 && y1 <= n && m1[x1][y1] == '.') {// 靠海,直接淹没m1[x][y] = '*';break;}}if (m1[x][y] == '*') {// 沿海边拓展for (int i = 0; i < 4; i++) {int x1 = x + dir[i][0];int y1 = y + dir[i][1];if (1 <= x1 && x1 <= n && 1 <= y1 && y1 <= n && m1[x1][y1] == '#') {submerge(x1, y1);}}}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> m1[i][j];}}int begin = 0;resetVis();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {begin += cntIs(i, j);}}resetVis();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {submerge(i, j);}}int end = 0;resetVis();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {end += cntIs(i, j);}}// cout << begin << " " << end << "\n";cout << (begin - end) << "\n";return 0;
}

“这颗星球正在沉没——”

“海平面因不明原因急速上升,海洋吞没了大部分沿海地区,如今也不断蚕食着陆地。”

“人类的栖息地被迫收缩,处于巅峰的科学技术渐渐流失。”

“这是缓步迈向灭亡的平静时代。”

“我与他邂逅了。”

“他说自己必须拯救地球——”

“于是我问道。”

“——地球也包括我吗……?”

“我守望着。”

“守望着渐渐沉没的地球。”

“守望着反抗灭亡的宿命,奋力挣扎的人们。”

“身处无限的孤独之中……”

“时间流逝吧,你是多么的残酷——”

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-面经

经历了2023年的秋招&#xff0c;现在也已经入职半年了&#xff0c;空闲时间将面试中可能遇到的机器学习问题整理了一下&#xff0c;可能答案也会有错误的&#xff0c;希望大家能指出&#xff01;另外&#xff0c;不论是实习&#xff0c;还是校招&#xff0c;都祝福大家能够拿到…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台&#xff0c;发现三个比较好的大模型平台&#xff0c;对普通用户也比较的友好的&#xff0c;而且返回内容相对来说&#xff0c;正确率更高的&#xff0c;并且相关场景插件比较丰富的国内厂商。 本文说的&#xff0c;是我自己觉得的&#xff0c;比较有主观…

蓝桥杯-排序

数组排序 Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序&#xff0c;并且时按从小到大的顺序。 package Work;import java.util.*;public class Imcomplete {public static void main(String args[]) {int arr[]new int [] {1,324,4,5,7,2};Arrays.sort(arr)…

第一次捡垃圾

配置 cpu e3 1225 v6 淘宝 130 显卡 p106-100(1060矿卡的特称) 咸鱼 118 内存 8g 3200频率 2 咸鱼 702140 硬盘 128g 固态 咸鱼 35 主板 ex-b150m-v3 咸鱼 110 电源 400w 咸鱼 58 4热管cpu散热器 咸鱼 28 机箱 迷你 拼多多 28 电源线 1m5 淘宝 8 pcie转m.2 拼多多 9 编程器 用…

NineData与OceanBase完成产品兼容认证,共筑企业级数据库新生态

近日&#xff0c;云原生智能数据管理平台 NineData 和北京奥星贝斯科技有限公司的 OceanBase 数据库完成产品兼容互认证。经过严格的联合测试&#xff0c;双方软件完全相互兼容、功能完善、整体运行稳定且性能表现优异。 此次 NineData 与 OceanBase 完成产品兼容认证&#xf…

搜维尔科技:3D Systems Geomagic Design X 逆向工程软件

产品概述 3D Systems Geomagic Design X 是全面的逆向工程软件 GeomagicoDesign XTM是全面的逆向工程软件&#xff0c;它结合了基于特征的CAD数模与三维扫描数据处理&#xff0c;使您能创建出可编辑、基于特征的CAD数模&#xff0c;并与您现有的CAD软件兼容。 拓展您的设计能…

ElasticSearch开篇

1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。 1.2 ElasticSearch与Lucene的关…

【Linux】权限管理(文件的访问者、类型和访问权限,chmod、chown、chgrp、umask,粘滞位)

目录 00.前言 01.文件访问者的分类 02.文件类型和访问权限 文件类型&#xff1a; 文件基本权限&#xff1a; 03.文件权限值的表示方法 04.访问权限的设置 &#xff08;1&#xff09;chmod &#xff08;2&#xff09;chown &#xff08;3&#xff09;chgrp &#xff0…

实战:循环神经网络与文本内容情感分类

在传统的神经网络模型中&#xff0c;是从输入层到隐含层再到输出层&#xff0c;层与层之间是全连接的&#xff0c;每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能为力。例如&#xff0c;你要预测句子的下一个单词是什么&#xff0c;一般需要用到前面的单…

微服务基础

目录 一、单体架构 二、分布式架构 三、微服务 四、微服务结构 五、SpringCloud 六、服务拆分 七、远程调用 一、单体架构 单体架构就是将业务的所有功能都集中在一个项目中进行开发&#xff0c;并打成一个包进行部署。 他的优点很明显&#xff0c;就是架构简单&#xff…

在分布式环境中使用状态机支持数据的一致性

简介 在本文中&#xff0c;我们将介绍如何在分布式系统中使用transaction以及分布式系统中transaction的局限性。然后我们通过一个具体的例子&#xff0c;介绍了一种通过设计状态机来避免使用transaction的方法。 什么是数据库transaction Transaction是关系型数据普遍支持的…

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbility的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton&#xff08;单实例模式&#xff09;启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

动态内存经典笔试题分析

题目1&#xff1a; void GetMemory(char *p) { *p (char *)malloc(100); } void Test(void) { char *str NULL; GetMemory(str); strcpy(str, "hello world"); 对NULL指针解引用操作符程序崩溃。 printf(str); } 请问运行Test函数会有什么样的后果&#xff1f; G…

温室气体排放控制中的DNDC模型建模技术及双碳应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

【C++从练气到飞升】01---C++入门

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 推荐 前言 什么是C C的发展史 &#x1f4cb;命名空间 命名空间定义 命名空间使用 命名空间的嵌套 std命名空间的使用 &#…

离散数学例题——4.计数和集合论(特殊关系、计数基础和函数)

等价关系 等价关系的证明 等价类和商集 等价关系与划分一一对应 偏序关系 证明偏序关系 哈斯图 整除关系画哈斯图 特殊元素 最大最小元&#xff0c;极大极小元 上界上确界&#xff0c;下界下确界 其他关系 全序关系、良序关系 拟序关系、相容关系 计数基础 排列组合 函数定义…

Chromium内核浏览器编译记(四)Linux版本CEF编译

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/136508294 本文出自 容华谢后的博客 0.写在前面 本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑&#xff0c;以防止后续再用到的时候忘记&#xff0c;同时也希望能够帮助到遇到同样问…

离散数学例题——5.图论基础

基本的图 关联矩阵 子图和补图 度数和握手定理 注意&#xff01;&#xff01;&#xff01;无向图的度数&#xff0c;要行/列和对角线值 根据度数序列判定是否为无向图 度和握手定理证明题 竞赛图 同构图 自补图 通路和回路数量 通路和回路数量 最短路径——dijkstra算法 连通…

[数据结构初阶]队列

鼠鼠我呀&#xff0c;今天写一个基于C语言关于队列的博客&#xff0c;如果有兴趣的读者老爷可以抽空看看&#xff0c;很希望的到各位老爷观点和点评捏&#xff01; 在此今日&#xff0c;也祝各位小姐姐女生节快乐啊&#xff0c;愿笑容依旧灿烂如初阳&#xff0c;勇气与童真永不…