全球变暖–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(); 执行时读入一个换行符所以为空