2018年蓝桥杯JAVA B组“全球变暖”题目详解

2023-11-23 01:00

本文主要是介绍2018年蓝桥杯JAVA B组“全球变暖”题目详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对2018年蓝桥杯JAVA B组“全球变暖”题目详解

题目

标题:全球变暖
你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:
……..##.....##........##...####....###.…….
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…….…….…….…….....#..…….…….
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7![……..##.....##........##...####....###.…….](https://img-blog.csdnimg.cn/20190301160529511.png)
【输出样例】
1
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

思路:
1.由于二维字符矩阵不能直接存入char[][]矩阵中,所以使用String[i]间接存储,i为行数,String[i]记录第i+1行的字符序列,之后再通过String的toCharArray()方法将每行字符序列转换为char数组,这样就利用char[][]存储了二维字符序列。
注明:采用char[][]进行存储要优于String[]存储,因为后续需进行遍历操作,而使用String中的charAt()方法虽然也可达到相同效果,但效率相比于char[][]来说效率要差很多。
2.二维矩阵存储后,首先要统计未发生淹没过程时的岛屿数。首先两个for循环遍历矩阵每个字符,如果这个字符是陆地(’#’)且未曾访问过,则岛屿数+1,之后从该字符处进行深度搜索,目的将与该字符相连的所有陆地标记为已访问(同属于同一个岛屿)。
3.对于dfs方法中,首先需判断i,j是否超出矩阵边界,避免下标越界情况出现。之后将该字符处的访问标志为置1表示已访问过,然后依次判断该字符上右下左四个方向是否存在陆地且未曾访问过,如果存在则把找到的符合条件的字符作为当前字符,继续深搜,这样属于同一个岛屿的陆地访问标志都变成了1,且岛屿数只加过1次。
4.进行淹没过程。同样使用两个for循环逐个字符判断,如果陆地的上下左右四个方向中某个方向存在海洋,则该陆地将变为海洋。这里需注意,要避免前面的陆地变成海洋带来的影响,为了便于说明,举个例子,如下图所示。

淹没前
......
..###.
..###.
.####.
......正确淹没后
......      
......
...#..
......
......错误淹没后
......      
......
......
......
......

如果不考虑相互之间的影响,仅考虑上下左右四个方向是否存在海洋,存在就直接将陆地改为海洋,则会导致上图中的错误淹没后结果,因为前一个陆地淹没后,对于下一个要判断的相邻陆地来说,由于前一个陆地已经变为海洋,对于要判断的陆地的某个方向肯定存在海洋了,则该判断陆地将直接变为海洋,这很明显是错误的。为了避免前一个陆地修改后影响下一个陆地的判断,引入修改位vis[][]。
5.淹没过程结束后,再次使用dfs方法计算淹没后剩余的岛屿数,淹没前岛屿数与淹没后岛屿数相减,即消失的岛屿数。

详细代码如下:

import java.util.Scanner;public class Main {static int N;static int[][] dfs_vis;//dfs深度搜索  检查当前点上右下左四个方向是否同时满足陆地、未访问两个条件//满足条件就以该点为下一个检查点进行判读,同时将访问标志设为1static void dfs(char[][] a,int i,int j){if(i>=1&&i<N-1&&j<N-1&&j>=1){//访问标志设为1dfs_vis[i][j]=1;//上if(a[i-1][j]=='#'&&dfs_vis[i-1][j]==0){dfs(a,i-1,j);}//右if(i>=1&&j<N-1&&a[i][j+1]=='#'&&dfs_vis[i][j+1]==0){dfs(a,i,j+1);}//下if(i>=1&&j<N-1&&a[i+1][j]=='#'&&dfs_vis[i+1][j]==0){dfs(a,i+1,j);}//左if(i>=1&&j<N-1&&a[i][j-1]=='#'&&dfs_vis[i][j-1]==0){dfs(a,i,j-1);}}}public static void main(String[] args){Scanner scan=new Scanner(System.in);N=scan.nextInt();String[] s=new String[N];char[][] c=new char[N][N];dfs_vis=new int[N][N];for(int i=0;i<N;i++){s[i]=scan.next();}scan.close();int[][] vis=new int[N][N];for(int i=0;i<N;i++){c[i]=s[i].toCharArray();		}//未淹没岛屿数int pre_sum=0;for(int i=1;i<N-1;i++){for(int j=1;j<N-1;j++){if(c[i][j]=='#'&&dfs_vis[i][j]==0){dfs(c,i,j);pre_sum++;}}}//System.out.println(pre_sum);//淹没过程for(int i=1;i<N-1;i++){for(int j=1;j<N-1;j++){if(c[i][j]=='#'){if((c[i-1][j]=='.'&&vis[i-1][j]==0)||(c[i+1][j]=='.'&&vis[i+1][j]==0)||(c[i][j-1]=='.'&&vis[i][j-1]==0)||(c[i][j+1]=='.'&&vis[i][j+1]==0)){c[i][j]='.';vis[i][j]=1;}}}}//打印淹没后结果/*for(int i=0;i<N;i++){for(int j=0;j<N;j++){System.out.print(c[i][j]);}System.out.println();}*///淹没后岛屿数dfs_vis=new int[N][N];int now_sum=0;for(int i=1;i<N-1;i++){for(int j=1;j<N-1;j++){if(c[i][j]=='#'&&dfs_vis[i][j]==0){dfs(c,i,j);now_sum++;}}}//System.out.println(now_sum);//两者之差就是淹没的岛屿数System.out.println(pre_sum-now_sum);}
}

附一组测试用例

8
........
..####..
.####.#.
..##....
....#.#.
.#.###..
...###..
........

用了多组测试用例测试,结果都对了,但不知道是否还存在疏漏的地方,如果大家发现不对的地方,欢迎评论指正,我会第一时间改掉,免得误导别人……

这篇关于2018年蓝桥杯JAVA B组“全球变暖”题目详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_41176515/article/details/90115791
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/414193

相关文章

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三