2018年第九届蓝桥杯省赛-日志统计:第九题:全球变暖

125 阅读1分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

第九题:全球变暖

题目描述

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

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

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

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

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

.......

.......

.......

.......

....#..

.......

.......

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

【输入格式】

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

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

【输出格式】

一个整数表示答案。

【输入样例】

7

.......

.##....

.##....

....##.

..####.

...###.

.......

【输出样例】

1

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

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

不要使用package语句。不要使用jdk1.7及以上版本的特性。

主类的名字必须是:Main,否则按无效代码处理。

代码

package day_10;

import java.util.Scanner;

public class 全球变暖{
	static int n,cona=0,conb=0;;
	static char[][] chs;
	static boolean[][] jug,flag,flag2;
	
	
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		n = Integer.parseInt(scanner.next());
		
		chs = new char[n+1][n+1];
		
		//获取“地图”
		for(int i=1; i<=n; i++) {
			String str2 = " " + scanner.next() + " ";
			chs[i] = str2.toCharArray();
		}
		
		jug = new boolean[n+1][n+1];
		
		//如果前后左右都是海洋则标记可淹没
		for(int i=2; i<=n; i++) {
			for(int j=2; j<=n; j++) {
				if(chs[i][j]=='#') {
					if(chs[i-1][j]=='.' || chs[i][j+1]=='.' || chs[i+1][j]=='.'||chs[i][j-1]=='.') {
						jug[i][j] = true;
					}
				}
			}
		}
				
		
		flag2 = new boolean[n+1][n+1];  
		flag = new boolean[n+1][n+1];  
		
		int con=0;
		for(int i=2; i<=n; i++) {
			for(int j=2; j<=n; j++) {
				if(jug[i][j] && !flag2[i][j]) {
					cona=1;
					conb=1;		 
					dfs2(i,j);  
					dfs(i,j); 
					if(cona==conb) con++;
					
				}
			}
		}
		System.out.println(con);
	}
	
	
	// 遍历上下左右四个位置
	static int xx[] = {-1, 0, 1, 0};
	static int yy[] = {0,1,0,-1};
	public static void dfs(int x, int y) {
		if(x>n && y>n) return;
		flag[x][y]=true;
		for(int i=0; i<4; i++) {
			if(x+xx[i]>=2 && x+xx[i]<=n-1 && y+yy[i]>=2 && y+yy[i]<=n-1) {
				int a = x+xx[i];
				int b = y+yy[i];
				if(jug[a][b] && !flag[a][b]) {
					dfs(a,b);
					cona++;
				}
			}
		}
	}
	public static void dfs2(int x, int y) {
		if(x>n && y>n) return;
		flag2[x][y]=true;
		for(int i=0; i<4; i++) {
			if(x+xx[i]>=2 && x+xx[i]<=n-1 && y+yy[i]>=2 && y+yy[i]<=n-1) {
				int a = x+xx[i];
				int b = y+yy[i];
				if(chs[a][b] == '#' && !flag2[a][b]) {
					dfs2(a,b);
					conb++;
				}
			}
		}
	}
	
	
}