Advertisement

2018第九届Java A组蓝桥杯省赛真题第八题:全球变暖

阅读量:

全球变暖:

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


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

其中四面相连的一块区域组成一座岛屿。如图所示,共有两处这样的岛屿。

全球变暖导致海平面持续上升。科学家预测在未来几十年内,在岛屿边缘区域的一个像素单元范围内将被海水淹没。具体而言,在一块陆地像素单元与其四周的四个邻近像素存在海洋单元的情况下,则会被淹没。

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





…#…

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

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

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

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

【输入样例】
7

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

【输出样例】
1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
个人解题思路最重要的几点:
1.对陆地区域进行数字编码标识
2.确保所有相邻区域均满足淹没条件
3.首先需追踪哪些区域未受水浸没;例如,在原有标记中将‘4’转化为‘8’表示这些岛群无法被淹没
4.对所有未受影响的关键岛群进行最终编码,并计算其数量与初始数量之差

复制代码
    //自己弄的样例输入
    8
    ........
    .###..#.
    .###..#.
    .#####..
    ...###..
    ...###..
    .#......
    ........
    //样例输出最终会被淹没的岛屿
    2

算法代码

复制代码
    static char[][] s = new char[1002][1002];;
    	public static void main(String[] args) {
    		int i, n, j, ans = 0, sum = 0;
    		Scanner sc = new Scanner(System.in);
    		n = sc.nextInt();
    		sc.nextLine();
    		for (i = 1; i <=n; i++) {
    			String str = "."+sc.nextLine();
    			s[i] = str.toCharArray();
    		}
    		for (i = 1; i <= n; i++)// 找寻多少块岛屿;
    			for (j = 1; j <= n; j++)
    				if (s[i][j] == '#') {
    					zx(i, j); // 将同一块岛屿 标记防重复
    					ans++;
    				}
    		for (i = 1; i <= n; i++)// 找寻那些块岛屿不会被淹;
    			for (j = 1; j <= n; j++)
    				if (s[i][j] >= '4' && s[i][j] <= '9') {
    					s[i - 1][j] += 1;
    					s[i + 1][j] += 1;
    					s[i][j - 1] += 1;
    					s[i][j + 1] += 1;
    				}
    		for (i = 1; i <= n; i++)// 找寻剩多少块岛屿;
    			for (j = 1; j <= n; j++)
    				if (s[i][j] == '8') {
    					zx2(i, j); // 将同一块岛屿 标记防重复
    					sum++;
    				}
    //		for (i = 1; i <= n; i++) {// 输出不会被淹没的岛屿图
    //			for (j = 1; j <= n; j++)
    //				System.out.print(s[i][j]);
    //			System.out.println();
    //		}
    		System.out.println(ans - sum);
    	}
    
    	static void zx(int x, int y) {
    		if (s[x][y] != '#')
    			return;
    		s[x][y] = '4';
    		zx(x + 1, y);
    		zx(x - 1, y);
    		zx(x, y - 1);
    		zx(x, y + 1);
    
    	}
    	static void zx2(int x, int y) {
    		if (s[x][y] >= '4' && s[x][y] <= '9')
    		// 为岛屿则全部淹没(不管这个大岛最后有多少小岛出来)
    		{
    			s[x][y] = '*';
    			zx2(x + 1, y);
    			zx2(x - 1, y);
    			zx2(x, y - 1);
    			zx2(x, y + 1);
    		}
    		return;
    	}

全部评论 (0)

还没有任何评论哟~