全球变暖

你有一张某海域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;
        }
    

}

 

posted @ 2020-03-02 16:40  智阿广  阅读(213)  评论(0)    收藏  举报