全球变暖问题(floodfill 处理联通块问题)

2023-09-18 19:34:19

全球变暖问题

前言

之前我们介绍了 bfs算法在二维,三维地图中的应用,现在我们接续进行拓展,解锁floodfill 算法,准确的来说是用 bfs算法解决联通块问题。后续还会更新 bfs算法有关内容,喜欢的小伙伴可以点个关注啦。

题目描述

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

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

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

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

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

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

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

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

输入格式
第一行包含一个整数N。

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

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

输出格式
一个整数表示答案。

数据范围
1≤N≤1000
输入样例1:
7

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

输出样例1:
1
输入样例2:

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

输出样例2:
1

题目分析

边界问题的考虑

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

这里想要不考虑边界问题,输入的初始下标要设为 1 开始,这样就可以保证数组不越界,并且由题目的意思可得,外围的圈都是海洋,只要下标从1 开始,我们就可以不用考虑bfs算法当中的边界问题。

岛屿是否被淹没判断:

如何判定这是一个不会被淹没的岛屿呢?
首先我们要明白联通块的概念------连在一起的快;
接着我们定义一个沿岸元素

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

也就是说只要一个‘#’旁边有海洋,我们就可以认定该陆地元素‘#’是沿岸元素块。
只要我们的联通块的所有总数=沿岸元素的所有总数,那么我们就可以判定这是个会被淹没的岛屿

如何寻找联通块:

答案就是利用我们的 bfs算法将目标元素进行宽度优先搜索,将搜索到的的‘#’,标记,继续搜索那些没有被标记的‘#’

代码

详细的解释都在代码的注释里头啦

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N =1e3 + 7;
char g[N][N];//用来存放地图
bool st[N][N];//用来统计那些点已经被搜索过了
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
typedef pair<int,int> PII;
void bfs(int i,int j,int &total,int &bound){
//这里使用的引用符号是&,要将值传回去。
    st[i][j]=true;
    queue<PII> q;
    q.push({i,j});
    while(!q.empty()){
        auto t=q.front();
        q.pop();
        total++;
        bool flag=false;//这个flag用于沿岸元素的判断
        for(int i=0;i<4;i++){
            int x=t.first+dx[i];
            int y=t.second+dy[i];
            if(g[x][y]=='#' && !st[x][y]){
                q.push({x,y});
                st[x][y]=true;
            }
            if(g[x][y]=='.'){//只要有一个旁边元素是‘.’就可以判断其为沿岸元素
                flag=true;
            }
        }
        if(flag) bound++;//如果判断成功,沿岸元素++
    }
}
int main(){
    int n;cin>>n;
    memset(g,'.',sizeof g);//在题目分析中的说明里,
    //这个代码可要可不要,假如没有题目中的话,我们就要加上这行代码了
    for(int i=1;i<=n;i++) cin>>g[i];
    int res=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!st[i][j] && g[i][j]=='#'){
                int total=0,bound=0;
                bfs(i,j,total,bound);
                if(total==bound) res++;//判断这个岛屿是否会被淹没
            }
            
        }
    }
    cout<<res<<endl;
    return 0;
}

预告

后期还放出大学生 web大作业【制作一个门户网站】,感兴趣的小伙伴可以点个关注啦

更多推荐

【面试题精讲】如何将二进制转为十六进制

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址文章更新计划系列文章地址/***二进制转换为十六进制*这里主要用于处理图片数据,因为数据库存储了图片的Base64编码*/privateStringbytesToHexString(by

CVPR 2023 | UniMatch: 重新审视半监督语义分割中的强弱一致性

在这里和大家分享一下我们被CVPR2023录用的工作"RevisitingWeak-to-StrongConsistencyinSemi-SupervisedSemanticSegmentation"。在本工作中,我们重新审视了半监督语义分割中的“强弱一致性”方法。我们首先发现,最基本的约束强弱一致性的方法FixMat

数据结构:线性表之-队列

目录什么是队列?详解:功能介绍代码实现定义队列基本结构1,初始化2,销毁3,尾入数据4,头出数据5,取队头的数据6,取队尾的数据7,判断是否为空8,计算队列中的元素成品Queue.hQueue.ctest.c队列的讲解将建立在有双向链表的基础之上进行讲解当然队列只是链表的一种分支单项链表详解:#数据结构:线性表之-单向

Spring底层原理之 BeanFactory 与 ApplicationContext

🐌个人主页:🐌叶落闲庭💨我的专栏:💨c语言数据结构javaEE操作系统Redis石可破也,而不可夺坚;丹可磨也,而不可夺赤。Spring底层原理一、BeanFactory与ApplicationContext二、BeanFactory功能三、ApplicationContext功能3.1getMessage3.

【计算机网络】IP协议第一讲(协议格式介绍)

IP协议1.协议头格式1.1概念介绍1.2补充说明1.2.18位生存时间---TTL1.2.216位首部检验和首先明确一个概念:TCP/IP协议是配合使用的,TCP负责可靠传输策略,IP则是负责传输,TCP协议是位于传输层提供的是策略解决可靠性问题,IP协议在网络层,提供的是网络传输服务,实现A主机到B主机的跨网络通信

Python爬虫异常处理实用技巧分享

当我们编写爬虫程序时,经常会遇到各种各样的异常情况,比如网络连接失败、页面解析错误、请求被拒绝等等。这些异常情况可能导致程序中断或者无法正常运行,给我们的数据采集工作带来一定的困扰。所以,掌握一些实用的异常处理技巧对于提高爬虫的稳定性和效率非常重要。在Python中,我们可以使用try-except语句来处理异常。下面

DSOX3012A是德科技keysight DSOX3012A示波器

181/2461/8938是德科技DSOX3012A(安捷伦)示波器是德科技DSOX3012A(安捷伦)是InfiniiVision3000X系列中的双通道型号。这款可升级示波器采用突破性技术设计,提供卓越的性能和功能。其独特的5仪器合一设计为相同的预算提供了更大的范围。是德科技DSOX3012A示波器的特性和规格包括

网络安全深入学习第五课——热门框架漏洞(RCE— Apache Shiro 1.2.4反序列化漏洞)

文章目录一、序列化和反序列化二、反序列化漏洞原理三、ApacheShiro1.2.4反序列化漏洞1、漏洞描述:2、漏洞影响的版本3、Shiro反序列化漏洞原理4、工作原理:5、shiro反序列化的特征:四、ApacheShiro1.2.4反序列化漏洞手工复现1、使用DNSlog严重漏洞是否存在2、VPS监听端口3、构造

【Vue】如何搭建SPA项目--详细教程

🎬艳艳耶✌️:个人主页🔥个人专栏:《Spring与Mybatis集成整合》《springMvc使用》⛺️生活的理想,为了不断更新自己!目录1.什么是vue-cli2.安装2.1.创建SPA项目2.3.一问一答模式答案3.运行SPA项目3.1.导入项目3.2.运行项目4.基于SPA项目完成路由4.1.案例实操5.基于

Python灰帽子编程————网页信息爬取

爬取图片,问题分解:获取网页内容;从网页内容中提取图片地址;通过图片地址,将图片下载到本地。1.相关模块1.1requests模块获取网页内容。requests模块:主要是用来模拟浏览器行为,发送HTTP请求,并处理HTTP响应的功能。importrequests#被认为,最贴近与人的操作的模块importurllib

【C++】C++ 引用详解 ⑥ ( 普通变量 / 一级指针 / 二级指针 做函数参数的作用 )

文章目录一、普通变量/一级指针/二级指针做函数参数的作用1、普通变量做函数参数的作用2、一级指针做函数参数的作用3、二级指针做函数参数的作用4、代码示例-二级指针做函数参数的作用一、普通变量/一级指针/二级指针做函数参数的作用1、普通变量做函数参数的作用普通变量的作用:将普通变量传入函数作为参数,则可以在函数中,访问到

热文推荐