蓝桥杯·全球变暖Java-2018-9

题目描述

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

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

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

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

…....
…....
…....
…....
…#…
…....
…....

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

【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。

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

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

【输入样例】
7
…....
.##….
.##….
….##.
..####.
…###.
…....

【输出样例】
1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

思路:

在输入海域像素点后,通过for循环,找出每个海水像素点,并判断其上下左右是否是陆地,如果是陆地则将其替换为“ * ”号(新海洋不会侵占陆地)。通过以上步骤获得海平面上升后的新海域,如下图。获得新海域后,通过广度优先搜索获得岛屿个数。即设置一个链表,通过for循环搜索陆地“#”,找到陆地后,将其加入链表,通过while循环判断链表是否为空,进入循环后依次判断该陆地周围是否有陆地,如果有则将其加入链表,如果没有则继续判断。判断完成后,如果链表不为空,则继续进行循环,寻找相连的陆地,直至找出此块完整的陆地。退出循环,count加1。最终的count即为海平面上升后的陆地数。

代码:

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		String[][] arr = new String[N][N];
		int[][] search = {{1,0},{-1,0},{0,1},{0,-1}};
		LinkedList<int[]> list = new LinkedList<>();
		//输入海域的像素点
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				arr[i][j] = sc.next()+"";
			}
		}
		//海平面上升后的海域
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				for(int k=0;k<search.length;k++){
					if(arr[i][j].equals(".")){
						int m = i+search[k][0];
						int n = j+search[k][1];
						if(m>=0 && m<N && n>=0 && n<N){
							if(arr[m][n].equals("#")){
								arr[m][n] = "*";
							}
						}
					}	
				}
			}
		}
		//输出海平面上升后的海域
		/*for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				System.out.print(arr[i][j]);
			}
			System.out.println();
		}*/
		//广度优先搜索,查找岛屿数
		int count = 0;
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				if(arr[i][j].equals("#")){
					int[] point = {i,j};
					list.add(point);
					while(!list.isEmpty()){
						int[] poll = list.poll();
						arr[poll[0]][poll[1]] = "*";//将访问过的陆地设置为*
						for(int k=0;k<search.length;k++){
							int m = poll[0]+search[k][0];
							int n = poll[1]+search[k][1];
							if(m>=0 && m<N && n>=0 && n<N){
								if(arr[m][n].equals("#")){//判断下一层是否是陆地,如果是则加入链表
									int[] point2 = {m,n};
									list.add(point2);
								}
							}
						}
					}	
					count++;//统计连续的岛屿数
				}
			}
		}
		
		System.out.println(count);
	}
}

结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值