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;
}
}