全球变暖(蓝桥杯,acwing每日一题)

题目描述:

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

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

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

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

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

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

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

输入格式:

第一行包含一个整数N。

以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。

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

输出格式:

一个整数表示答案。

数据范围:

1≤N≤1000

输入样例1:

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

输出样例1:

1

输入样例2:

9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........

输出样例2:

1

分析步骤:

  第一:读完题目我们可以发现,靠近海边的陆地需要变成海洋,只有一块陆地周围全是陆地才可以不被淹没。我们可以把陆地周围全是陆地的这种地方叫做高地,海水是进不了的所以只能淹没低洼的地方,所以符合我们 flood fill 算法的思想 再结合宽搜的算法就可以解出这道题目。

  第二:书写主函数构建整体架构

             首先输入值

             再套用flood fill算法的一个模板从第一个位置开始遍历如果遇到了 “ # ” 并且这个点是没有被搜过的才可以进入我们的 bfs 算法去搜索。我们定义一个 total 代表 遍历到了几个“#” 定义一个bound 代表 这些陆地是否靠近海洋,只有遍历到的 陆地的数量 和 靠近海洋的陆地的数量一样我们才可以确定这个小岛会消失 res++;

int main()
{cin>>n;for(int i = 0 ; i < n ; i ++){cin>>g[i];}for(int i = 0 ; i < n ; i++){for(int j = 0 ; j < n ; j ++){if(g[i][j] == '#' and !st[i][j]){int total = 0 , bound = 0;bfs(i,j,total,bound);if(total == bound) res++;}}}cout<<res;return 0;
}

  第三:书写BFS算法去遍历图中每一个点:

             首先,我们一般写bfs会自己手动写一个队列,手动将刚刚进入的横纵坐标入队,所以定义头节点为0 尾节点也为0;更改状态这个点为已经走过了;

             其次,开始进入while循环只要我们的队列不为空我们的循环就不会停止,因为我们遍历到的每一个符合条件的点都会入队,所以只有将在队列里的每一个点都处理过后才可以停止循环。

             我们定义一个迭代器 t 让他自己去向后遍历队列,随后 total++ ,为什么? 因为能进入到队列的点都是“ # ”为陆地,而我们的total的意义也正是代表 遍历到了几个“#”  ,再定义一个is_bound,这个是代表陆地旁边是否有海洋,如果有海洋就将它改为true,只有它为true了 我们的bound才能++。

             随后进入我们的四方搜索(上下左右)定义一个a让它代表横坐标 , 定义一个b让他代表纵坐标。我们得到了新的一个坐标之后一般要进行三种判断:1.坐标是否越界;2.该坐标是否已经走过了;3.该点能不能走(因为有些题目有路障)。对于此题我们要进行1和2 , 第三点要进行改变应当改为如果是海洋的话,那么就证明该点的陆地应该被淹没所以将is_bound改为true。最后如果能通过种种限制的话那么就因该是符合我们条件的坐标,所以要更新一下坐标状态,再将此点入队。最终判断一下如果该点的四周有海洋的话 则 bound++。

void bfs(int xx , int yy , int &total ,int &bound){int hh = 0 , tt = 0;q[0] = {xx,yy};st[xx][yy] = true;while(hh <= tt){auto t = q[hh++];total ++;bool is_bound = false;for(int i = 0 ; i < 4 ;  i++){int a = dx[i]+t.x , b = dy[i] + t.y;if(st[a][b])continue;if(a<0||b<0||a>=n||b>=n) continue;if(g[a][b] == '.'){is_bound = true;continue;}st[a][b] = true;q[++tt] = {a,b};}if(is_bound) bound++;}
}

注意注意:我们这里的total和bound要进行地址传值这样在bfs中改变的值才可以反映到主函数之中

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y secondusing namespace std;
const int N = 1e3+10;
typedef pair<int, int> PII;
PII q[N*N];char g[N][N];  // 这是存地图的数组
bool st[N][N]; // 判断坐标是否走过
int n , res = 0;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};//以(0,0)为原点 上下左右搜索一个单位长度void bfs(int xx , int yy , int &total ,int &bound){int hh = 0 , tt = 0;q[0] = {xx,yy};st[xx][yy] = true;while(hh <= tt){auto t = q[hh++];total ++;bool is_bound = false;for(int i = 0 ; i < 4 ;  i++){int a = dx[i]+t.x , b = dy[i] + t.y;if(st[a][b])continue;if(a<0||b<0||a>=n||b>=n) continue;if(g[a][b] == '.'){is_bound = true;continue;}st[a][b] = true;q[++tt] = {a,b};}if(is_bound) bound++;}
}int main()
{cin>>n;for(int i = 0 ; i < n ; i ++){cin>>g[i];}for(int i = 0 ; i < n ; i++){for(int j = 0 ; j < n ; j ++){if(g[i][j] == '#' and !st[i][j]){int total = 0 , bound = 0;bfs(i,j,total,bound);if(total == bound) res++;}}}cout<<res;return 0;
}

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

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

相关文章

网络实名制接口-GO语言身份核验接口代码-身份证实名认证

互联网时代&#xff0c;人工识别身份证信息的方式已不适用于当下社会的发展需求&#xff0c;更需要高效精准的科技程序来支持&#xff0c;在线身份证实名认证接口必不可少。翔云身份证实名认证接口&#xff0c;可助力线上平台与消费者信用相关联&#xff0c;建立完善的客户资源…

nextjs 使用 lru-cache 进行缓存,在api里访问不到page中的缓存

因为Next.js中的页面和API路由是两个不同的执行上下文&#xff0c;它们之间的数据共享并不直接。 解决这个问题的一种常见方法是将缓存实例化为一个单独的模块&#xff0c;并在页面和API路由中共享这个模块。这样&#xff0c;无论是页面还是API路由&#xff0c;它们都可以访问…

爬虫技术实战案例解析

目录 前言 案例背景 案例实现 案例总结 结语 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊爬虫技术实战案例解析&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1…

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时&#xff0c;支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知&#xff0c;就是在界面中可以支持…

机器学习-04-分类算法-04-支持向量机SVM

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与SVM算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…

插件电阻的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,引脚设计3.2,电阻体3.3,封装4,工艺流程4.1,材料准备4.2,电阻体制作4.3,引脚焊接4.4,绝缘处理4.5,测试与筛选4.6,包装与存储

02_神经网络的数学基础

初始神经网络 用一个实际例子来理解神经网络。 使用MNIST数据集&#xff0c;它就像是深度学习的hello word&#xff0c;包含60000张训练图像和10000张测试图像。 代码地址&#xff1a; Google Colaboratory 2.2神经网络的数据表示 在例子中&#xff0c;数据存储在多维的N…

HTML5球体下落粒子爆炸特效

HTML5球体下落粒子爆炸特效&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 HTML5球体下落粒子爆炸特效

C++开发基础——可变参数与可变参数模板

一&#xff0c;可变参数 1.基础概念 可变参数在C语言和C语言编程中都有应用。 可变参数的含义是&#xff1a;在函数传参的时候&#xff0c;参数的数量、类型都是可变的&#xff0c;不确定的。 在C语言中&#xff0c;应用到可变参数的是可变参数函数和可变参数的宏。 在C语言…

阿里云2核4G4M轻量应用服务器价格165元一年

阿里云优惠活动&#xff0c;2核4G4M轻量应用服务器价格165元一年&#xff0c;4Mbps带宽下载速度峰值可达512KB/秒&#xff0c;系统盘是60GB高效云盘&#xff0c;不限制月流量&#xff0c;2核2G3M带宽轻量服务器一年87元12个月&#xff0c;在阿里云CLUB中心查看 aliyun.club 当前…

数据结构—稀疏多项式相加

利用链表实现两个稀疏多项式相加。 代码 #include <iostream> using namespace std;// 定义多项式项结构体 typedef struct {int x; // 系数int y; // 指数 } Elemtype;// 定义链表节点结构体 typedef struct Node {Elemtype data;struct Node* next; } *LinkList, N…

数据结构中单向链表(无头)的学习

一.数据结构 1.定义 一组用来保存一种或者多种特定关系的数据的集合&#xff08;组织和存储数据&#xff09; 程序的设计&#xff1a;将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中&#xff0c; 并在此基础上实现某个特定的功能的操…

VSCode + PicGo + Github 实现markdown图床管理

目录 PicGo客户端VSvode插件 PicGo客户端 PicGo 是一个图片上传管理工具 官网&#xff1a;https://molunerfinn.com/PicGo/ github图传使用说明&#xff1a;https://picgo.github.io/PicGo-Doc/zh/guide/config.html#GitHub图床 步骤&#xff1a; 1、创建一个github公开仓库…

elementUI 中使用 Popover 弹出框 el-popover自 如何自定义样式 ?(出现 popper-class 不生效,如何解决 ?)

动态赋值 &#xff1f; 通过 :content 动态赋值 <el-popoverplacement"right"title"驳回原因:"width"200"trigger"hover"popper-class"custom-popover":content noPassReason ><el-button slot"reference…

vmap与kmap介绍

vmap() 可以用来将多个物理页长期映射到一个连续的虚拟空间。它需要全局同步来解除映射。 kmap() 用来对单个页面进行短时间的映射&#xff0c;对抢占或迁移没有限制。 它会带来开销&#xff0c;因为映射空间是受限制的&#xff0c;并且受到全局锁的保护&#xff0c;以实现…

小程序搜索排名优化二三事

小程序的优化主要是排名优化和性能优化两个版块。性能优化这方面主要靠开发者自己完善&#xff0c;我们团队提供的服务就是把产品的排名打上去&#xff0c;获得更多的自然流量&#xff0c;实现盈利。 如何提升小程序的搜索排名主要从如下几个方面出发&#xff1a; 首先要知道…

2023新版mapinfo美化电子地图 新版2013Arcgis shp电子地图 下载

2023新版MapInfo和电子地图美化&#xff0c;以及2013版ArcGIS的SHP电子地图设计&#xff0c;是地理信息系统&#xff08;GIS&#xff09;领域中的两个重要话题。下面将分别对这两个主题进行描述。 样图&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WB4AGsycyBGagVq5…

文心一言赋能问卷生成,打造高效问卷调研工具

当前&#xff0c;各种大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;井喷式发展&#xff0c;基于LLM的应用也不断涌现。但是&#xff0c;当开发者基于LLM开发下游应用时&#xff0c;LLM直接生成的结果在格式、内容等方面都存在许多不确定因素&#xf…

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1 升序建大堆&#xff0c;降序建小堆 4.2堆…

【C语言步行梯】一级指针、二级指针、指针数组等 | 指针详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 什么是指针&#xff1f;指针的大小指针类…