全球变暖--2018蓝桥杯省赛

该博客讨论了一道编程竞赛题目,涉及全球变暖导致海平面上升的模拟。题目要求根据给定的海洋地图,预测因海平面上升而完全淹没的岛屿数量。解决方案包括遍历地图,标记陆地区域,并判断哪些岛屿会被完全淹没。通过Java代码实现,最终输出完全淹没的岛屿数量。博客还提醒了在Java输入输出中Scanner的使用细节,避免出现数据读取错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全球变暖–2018蓝桥杯省赛

题目描述

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

.##…

.##…

…##.

…####.

…###.

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

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

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

…#…

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

输入描述

第一行包含一个整数 (1≤N≤1000)。

以下 N 行 N 列代表一张海域照片。

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

输出描述

输出一个整数表示答案。

输入输出样例

示例
输入

7

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

输出

1

运行限制

最大运行时间:1s
最大运行内存: 256M

分析

  • 题目大意:
    连通的#形成一个岛屿,靠 . 的 # 都将不再组成岛屿
    求完全淹没的岛屿数量
  • 思路:
    假设所有岛屿都完全沉没,减去不沉的岛屿
    遍历遇到#
    沉默岛屿sum++
    开始搜索整个岛屿标记搜索过的#为$,搜索过程中判断是否有不沉的,有不沉默的sum–

AC代码

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static char[][] land;
    public static int[][] pos = {{0, -1}, {0, 1},{-1, 0}, {1, 0}};
    public static int sink = 0;
    public static int sum = 0; //沉默岛屿数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int n = Integer.parseInt(s);
        land = new char[n][n + 1];
        for (int i = 0; i < n; i++) {
            land[i] = sc.nextLine().toCharArray();
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(land[i][j] == '#'){
                    sum += 1;
                    sink = 0;
                    search(i, j);
                    sum -= sink;
                }
            }
        }
        System.out.println(sum);
        sc.close();
    }

    public static int isSink(int x, int y){
        for (int i = 0; i < 4; i++) {
            int xx = x + pos[i][0], yy = y + pos[i][1];
            if(xx < 0 || xx >= land.length || yy < 0 || yy >= land.length){
                continue;
            }
            if(land[xx][yy] == '.'){
                return 0;
            }
        }
        return 1;
    }

    public static void search(int x, int y){
        land[x][y] = '$';//标记
        if(sink == 0){
            sink = isSink(x, y); //判断
        }
        for (int i = 0; i < 4; i++) {
            int xx = x + pos[i][0], yy = y + pos[i][1];
            if(xx < 0 || xx >= land.length || yy < 0 || yy >= land.length){
                continue;
            }
            if(land[xx][yy] == '#'){
                search(xx, yy);
            }
        }
    }
}

补充

在java 的输入中要特别注意Scanner的使用,要理解其各个api的真确使用方法
比如这题之中的输入输出:

7
.......
.##....
.##....
....##.
..####.
...###.
.......

比如输入使用下面的代码(错误示范):

int n = sc.nextInt();
land = new char[n][n + 1];
for (int i = 0; i < n; i++) {
	land[i] = sc.nextLine().toCharArray();
}

打印land(或调试时)我们会发现land[0]为空串,真正的数据从land[1]开始且最后一行数据没有读入
原因就是当你使用sc.nextInt()时此api不会将换行符读入
而第一行为 7\n 7读完后此行还未读完
land[0] = sc.nextLine().toCharArray(); 执行时读入一个换行符所以为空

### 蓝桥杯全球变暖相关题目解题思路 #### 题目背景 蓝桥杯中的“全球变暖”题目主要涉及模拟海平面上升对岛屿的影响。通过给定的地图数据,判断哪些陆地会被淹没以及最终剩余的岛屿数量。 --- #### 解题步骤分析 1. **计算初始岛屿数量** 初始地图由字符`#`(代表陆地)和`.`(代表海洋)构成。为了统计初始岛屿的数量,可以通过深度优先搜索(Depth First Search, DFS)[^2] 或广度优先搜索(Breadth First Search, BFS)[^3] 来实现。 - 使用DFS方法时,从任意未访问过的`#`出发,将其及其相连的所有`#`替换为`.`,并记录一次操作作为发现了一个岛屿。 - 如果采用BFS,则同样从某个`#`开始扩展到与其连通的所有位置,并标记这些位置已处理。 这一过程重复执行直到原图中不存在任何`#`为止,此时所完成的操作次数即等于原始岛屿总数。 2. **确定受淹区域** 接下来需找出因海平面升高而可能消失的土地单元格。依据规则,只要某块陆地位于边界或者紧挨着至少一片水域(`.`),那它便会被水覆盖变为新的特殊状态符号如`*`来区分。 实现方式同样是扫描整个网格结构,在遇到符合条件的情况时更新对应坐标处的内容至指定标志符形式。 3. **重新评估残留岛群状况** 经历上述变化后的地形再次运用相同逻辑检测现存独立区块数目——也就是剩下没受影响仍保持完整的那些自然地貌部分;此环节依旧依赖先前介绍过的两种遍历手段之一来进行精确计数工作。 4. **得出最后结果** 最终答案便是原先存在的全部大陆板块减掉现在还维持现状者之外其余全毁掉的部分之差值表达式如下所示: \[ 被淹没的岛屿数量 = 岛屿总数 - 不会被淹没的岛屿总数 \] 此公式清晰表明我们需要对比两次测量所得数值差异从而获得目标解答[^4]。 --- ```python def dfs(grid, i, j): rows, cols = len(grid), len(grid[0]) if i < 0 or j < 0 or i >= rows or j >= cols: return if grid[i][j] != '#': return grid[i][j] = '.' directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] for di, dj in directions: ni, nj = i + di, j + dj dfs(grid, ni, nj) def count_islands(grid): islands = 0 rows, cols = len(grid), len(grid[0]) for i in range(rows): for j in range(cols): if grid[i][j] == '#': islands += 1 dfs(grid, i, j) return islands def mark_sunken_land(grid): rows, cols = len(grid), len(grid[0]) new_grid = [list(row) for row in grid] for i in range(rows): for j in range(cols): if new_grid[i][j] == '#': neighbors = [ (i-1,j),(i+1,j), (i,j-1),(i,j+1) ] for ni,nj in neighbors: if 0<=ni<rows and 0<=nj<cols and new_grid[ni][nj]=='.': new_grid[i][j]='*' return [''.join(row) for row in new_grid] initial_map = [".....",".#..#", "#...#","#...."] island_count_before = count_islands([list(line) for line in initial_map]) modified_map = mark_sunken_land(initial_map) island_count_after = count_islands([list(line) for line in modified_map]) print(f"Initial Island Count: {island_count_before}") print(f"After Rising Sea Level Island Count: {island_count_after}") print(f"Drowned Islands: {island_count_before-island_count_after}") ``` --- #### 结论 综上所述,“全球变暖”的核心在于如何有效率且准确无误地识别出各个阶段内的地理特征改变情况并通过适当算法加以量化比较进而求取所需信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值