【蓝桥杯 全球变暖】模拟思路

18 篇文章 0 订阅

标题:全球变暖

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

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

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

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

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

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

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

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

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

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


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

【输出样例】
1  

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。


思路:

按照题目的过程模拟,首先创建boolean数组,因为boolean占用的内存小,遇到‘#’将陆地的坐标置为true就可以了

初始化后判断其每个陆地的四周是否都有陆地,原始岛屿++,

在被海水淹没后,再判断一下还有多少岛屿

最后输出岛屿之差,就能得到被淹没的岛屿数量。(注意题干输出的什么)


代码:

public class 全球变暖_8 {
	static boolean photo[][];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int N;
		N = in.nextInt();
		photo = new boolean[N+1][N+1];
		String line;
		int original_island_count = 0;//原来的岛屿数
		int nowadays_island_count = 0;//现在的岛屿数
		line = in.nextLine();//过滤掉之前输入的整数的换行符
		//录入照片
		for(int i=1;i<=N;i++)
		{
			line = in.nextLine();
			//处理输入该行的字符串
			for(int j=0;j<line.length();j++)
			{
				if(line.charAt(j)=='#')//如果是陆地,置为true,并判断其周围,能否组成岛屿
				{
					photo[i][j] = true;
				}
			}
		}
		//检查岛屿数
		for(int i=1;i<=N;i++)
		{
			for(int j=0;j<N;j++)
			{
				if(photo[i][j])//报告!这有块陆地!检查周围是否都有岛屿
				{
					if(photo[i-1][j]&&photo[i+1][j]&&photo[i][j-1]&&photo[i][j+1])//如果四周都为true
					{
						original_island_count++;
					}
				}
			}
		}
		//若干年后
		for(int i=1;i<=N;i++)
		{
			for(int j=0;j<N;j++)
			{
				if(photo[i][j])//报告!这有块陆地!检查周围是否包含海水
				{
					if(!photo[i-1][j]||!photo[i+1][j]||!photo[i][j-1]||!photo[i][j+1])
					{
						photo[i][j] = false;//陆地被淹没
					}
				}
			}
		}
		//检查剩余陆地中有多少岛屿
		for(int i=1;i<=N;i++)
		{
			for(int j=0;j<N;j++)
			{
				if(photo[i][j])//报告!这有块陆地!检查周围是否都有岛屿
				{
					if(photo[i-1][j]&&photo[i+1][j]&&photo[i][j-1]&&photo[i][j+1])//如果四周都为true
					{
						nowadays_island_count++;
					}
				}
			}
		}
		System.out.println(original_island_count-nowadays_island_count);//输出被淹没的岛屿数量
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值