题目描述
标题:全球变暖
你有一张某海域NxN像素的照片,“。”表示海洋,“#”表示陆地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…
…
…
…
…#…
…
…
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N.(1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行,第1列,第N行,第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
…
.##…
.##…
…##.
…####.
…###.
…
【输出样例】
1
思路
- 输入每行字符串并调用toCharArray转化为字符数组
- 实现判定是否为岛屿以及淹没岛屿的方法,创建Map集合,将是岛屿的坐标放入Map中,将淹没的岛屿移除
- 打印map的大小,确定剩余的岛屿数
- 注意Map需要设置为静态
代码实现
package Competion.the2018;
import java.util.HashMap;
import java.util.Scanner;
public class quanqiubiannuan {
static int num1=0;
static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N=scanner.nextInt();
char[][] chars = new char[N][N];
for (int i = 0; i < N; i++) {
chars[i]=scanner.next().toCharArray();
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
isdaoyu(chars,i,j);
}
}
num1=map.size();//岛屿的数目
int num2=0;
for (int i = 0; i < N; i++) {
if (map.containsKey(i)){
getfall(chars,i,map.get(i));
}
}
System.out.println(map.size());
}
public static void getfall(char point[][],int i,int j){
if (point[i][j-1]=='.'||point[i-1][j]=='.'||point[i][j+1]=='.'||point[i+1][j]=='.'){
map.remove(i);
}
}
public static void isdaoyu(char[][] point, int i, int j){
//返回是岛屿的元素
if (i!=0&&i!=point.length-1&&j!=0&&j!=point.length-1){
if (point[i][j-1]=='#'&&point[i-1][j]=='#'&&point[i][j+1]=='#'&&point[i+1][j]=='#'){
map.put(i,j);
}
}
}
}