第十四届蓝桥杯打卡day25

1、全球变暖

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

.......

.##....

.##....

....##.

..####.

...###.

.......

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

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

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

.......

.......

.......

.......

....#..

.......

.......

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

输入描述

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

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

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

输出一个整数表示答案。

输入输出样例

示例

输入

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

输出

1

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.io.*;
public class wen {
  static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    static int[] dx=new int[]{0,0,-1,1};
    static int[] dy=new int[]{1,-1,0,0};
    static String[][]map = new String[1010][1010];
    static boolean[][]isTrue = new boolean[1010][1010];
    static int sum = 0;//会被淹没的岛屿数量
    static int sea = 0;//与海洋相邻的陆地个数
    static int land = 0;//总陆地个数
    static Queue<int[]> qe = new LinkedList<>();
    public static void main(String[] args)throws IOException {
        String []s = in.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        for(int i=1;i<=n;i++){//生成海域
          s = in.readLine().split("");
          for(int j=1;j<=n;j++){
              map[i][j]=s[j-1];
          }
        }
        for(int i=1;i<=n;i++){
          for(int j=1;j<=n;j++){
            if(map[i][j].equals("#")&&isTrue[i][j]==false){
              if(bfs(i,j)){
                sum++;
              }
            }
          }
        }
        out.println(sum);
        in.close();
        out.flush();

    }
    static boolean isSea(int x,int y){
          if(map[x-1][y].equals(".")||map[x+1][y].equals(".")||map[x][y-1].equals(".")||map[x][y+1].equals(".")){
            return true;
          }
          return false;
    }
    static boolean bfs(int x,int y){
        qe.offer(new int[]{x,y});//入队,刚开始是以第一个陆地进行bfs的
        isTrue[x][y]=true;//标记状态
        sea = 0;
        land = 0;//每次要重新计数,每个陆地都是单独进行扩展判断的
        while(!qe.isEmpty()){
          int []nums = qe.poll();
          land++;
          int nx = nums[0];
          int ny = nums[1];
          if(isSea(nx,ny)){//判断当前陆地是否临海
            sea++;
          }
          for(int i=0;i<4;i++){//遍历当前陆地四个方向的陆地
             int newx = nx+dx[i];
             int newy = ny+dy[i];
            if(map[newx][newy].equals("#")&&isTrue[newx][newy]==false){//是陆地且没有被标记
              qe.offer(new int[]{newx,newy});//入队
              isTrue[newx][newy]=true;//标记

            }
          }
        }
        if(sea==land){//说明被淹没了
          return true;
        }
        return false;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值