Acwing 1233. 全球变暖 (每日一题)

如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~

题目描述

你有一张某海域 N×N

像素的照片,"."表示海洋、"#"表示陆地,如下所示:

...

.##...

.##...

...##.

...####.

...###.

...

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

座岛屿。

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

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

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

...

...

...

...

...#...

...

...

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

输入格式

第一行包含一个整数N。

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

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

输出格式

一个整数表示答案。

数据范围

1≤N≤1000

输入样例1:

7

...

.##...

.##...

...##.

...####.

...###.

...

输出样例1:

1

分析

其中"上下左右"四个方向上#连在一起的一片陆地组成一座岛屿。

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

题目模拟(岛屿)

注:图中有3个岛屿,上下连续区域。

题目模拟(海洋淹没)

注:题中有一个岛屿全被淹没

题目解读

观察一下:岛屿中陆地的数量和海洋的数量是统一的。

如果这个陆地上下左右方向 只要有一个方向有.的话,就说明该陆地会被淹没

也就是只要我们在陆地上下左右方向 中找到了一个.,就说明这个陆地被淹没

换言之,如果说岛屿中陆地被淹没了,就存在至少一个方向 的海洋.
我们只需要统计岛屿的个数和海洋的个数即可。

如果海洋个数和岛屿中陆地的个数相等 ,则说明该岛屿已被淹没 。否则未被淹没

所以,关键在于维护海洋和岛屿中陆地的个数。

这题用BFS 来处理

首先没有点与点之间的关系,所以我们不用邻接表来存储边和点的关系。

而是用队列的方式去维护BFS一层一层往外搜,一层一层往外扩。

那在bfs中我们还需要维护其他变量 用于解决此题。

首先,我们需要去统计连通块(岛屿)中陆地的个数 res

这里在队头元素出队 的时候,统计一下即可。

设定isbound 来标记是边界的.

然后,弹出队头,进行上下左右的坐标移动,统计其上下左右方向是否有.
有的话,我们就将该位置的坐标标记上
false

最后统计一下每个岛屿的isbound个数有多少个。

如果说resisbound 相等,则说明该岛屿全部淹没

代码

java 复制代码
import java.util.*;
public class Main{
    static int N=1010;
    static char g[][]=new char[N][N];
    static boolean st[][]=new boolean [N][N];
    static int dx[]= {1,0,-1,0};
    static int dy[]= {0,-1,0,1};
    static int n;
    static int cnt;
    public static void main(String []args) {
    	Scanner in=new Scanner(System.in);
    	n=in.nextInt();
    	for(int i=0;i<n;i++) {
    		char a[]=in.next().toCharArray();
    		for(int j=0;j<n;j++) {
    			g[i][j]=a[j];
    		} 		
    	}
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<n;j++) {
    			if(g[i][j]=='#'&&!st[i][j]) {
    			if(bfs(i,j))cnt++;		
    		}
    	}
    	}
    System.out.println(cnt);	
    }
    public static boolean bfs(int x,int y) {
    	Queue<pair>q=new LinkedList<>();
    	q.add(new pair(x,y));
    	int res=0;
    	int bound=0;
    	st[x][y]=true;
    	while(!q.isEmpty()) {
    		pair t=q.poll();
    		res++;
    		boolean isbound=false;
    		for(int i=0;i<4;i++) {
    			int a=t.x+dx[i];
    			int b=t.y+dy[i];
    			if(a<0||a>=n||b<0||b>=n)continue;
    			if(st[a][b])continue;
    			if(g[a][b]=='.') {
    				isbound=true;
    				continue;
    			}
    			q.add(new pair(a, b));
    			st[a][b]=true;
    		}
    	if(isbound)bound++;	
    	}
    	return res==bound;
    }
}
class pair{
	int x;
	int y;
	public pair(int x,int y) {
		this.x=x;
		this.y=y;
	}
}

往期回顾

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

蓝桥杯每日N题 (消灭老鼠)

蓝桥杯每日N题(杨辉三角形)

蓝桥杯每日N题 (砝码称重)

蓝桥杯上岸每日N题(鸡尾酒)

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

蓝桥杯上岸必背模板 (纯享版)

相关推荐
中草药z10 分钟前
【嵌入模型】概念、应用与两大 AI 开源社区(Hugging Face / 魔塔)
人工智能·算法·机器学习·数据集·向量·嵌入模型
毕设源码-钟学长17 分钟前
【开题答辩全过程】以 家政服务平台为例,包含答辩的问题和答案
java
踩坑记录29 分钟前
leetcode hot100 189.轮转数组 medium
leetcode
知乎的哥廷根数学学派32 分钟前
基于数据驱动的自适应正交小波基优化算法(Python)
开发语言·网络·人工智能·pytorch·python·深度学习·算法
ADI_OP1 小时前
ADAU1452的开发教程10:逻辑算法模块
算法·adi dsp中文资料·adi dsp·adi音频dsp·adi dsp开发教程·sigmadsp的开发详解
xingzhemengyou11 小时前
C语言 查找一个字符在字符串中第i次出现的位置
c语言·算法
Dream it possible!2 小时前
LeetCode 面试经典 150_二分查找_在排序数组中查找元素的第一个和最后一个位置(115_34_C++_中等)
c++·leetcode·面试
sheji34162 小时前
【开题答辩全过程】以 家庭教育资源网为例,包含答辩的问题和答案
java
百***78752 小时前
Grok-4.1与GPT-5.2深度对比:技术差异、适用场景及Python集成指南
java·python·gpt