全球变暖
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
1
import java.util.LinkedHashSet; import java.util.Scanner; public class Main9 { static Scanner sc= new Scanner(System.in); static int n = sc.nextInt(); static char [][] num = new char[n][n]; static int[][] a = new int[n][n]; static boolean [][] b = new boolean[n][n]; //四个方向 static int []x ={0,1,0,-1}; static int []y ={1,0,-1,0}; static int sum = 0; public static void main(String[] args) { // TODO Auto-generated method stub for (int i = 0; i <n; i++) num[i]=sc.next().toCharArray();//一片海域 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j]=-1;//模拟一片海域 测试岛屿有没有被淹 } } for (int i = 0; i <n; i++) { for (int j = 0; j <n; j++) { if (!b[i][j]&&num[i][j]!='.') { f(i,j); sum++;//一个整岛屿 就加累加1 } } } LinkedHashSet<Integer> temp = new LinkedHashSet<Integer>(); for (int i = 0; i <n; i++) { for (int j = 0; j < n; j++) { temp.add(a[i][j]); } } temp.toArray(); System.out.println(sum-(temp.size()-1)); } private static void f(int o ,int p ) { b[o][p]=true;//经过的点做标记 for (int i = 0; i < 4; i++) { //判断上下左右 是否是海 int i1 = o+x[i]; int j1 = p+y[i]; if (fo(i1,j1)) { if (b[i1][j1]||num[i1][j1]=='.') //已被标记 或者 不是岛 { continue;//结束本次循环 } a[i1][j1]=sum; if(fo(i1-1,j1) && num[i1-1][j1]=='.')//上 a[i1][j1]=-1; if(fo(i1+1,j1) && num[i1+1][j1]=='.')//下 a[i1][j1]=-1; if(fo(i1,j1-1) && num[i1][j1-1]=='.')//左 a[i1][j1]=-1; if(fo(i1,j1+1) && num[i1][j1+1]=='.')//右 a[i1][j1]=-1; f(i1,j1); } } } static boolean fo(int i,int j) { if (i>=0&&j>=0&&j<n&&i<n) return true; return false; } }