题目描述
你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:
…....
.##….
.##….
….##.
..####.
…###.
…....
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…....
…....
…....
…....
…#…
…....
…....
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
…....
.##….
.##….
….##.
..####.
…###.
…....
【输出样例】
1
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
思路:
在输入海域像素点后,通过for循环,找出每个海水像素点,并判断其上下左右是否是陆地,如果是陆地则将其替换为“ * ”号(新海洋不会侵占陆地)。通过以上步骤获得海平面上升后的新海域,如下图。获得新海域后,通过广度优先搜索获得岛屿个数。即设置一个链表,通过for循环搜索陆地“#”,找到陆地后,将其加入链表,通过while循环判断链表是否为空,进入循环后依次判断该陆地周围是否有陆地,如果有则将其加入链表,如果没有则继续判断。判断完成后,如果链表不为空,则继续进行循环,寻找相连的陆地,直至找出此块完整的陆地。退出循环,count加1。最终的count即为海平面上升后的陆地数。
代码:
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String[][] arr = new String[N][N];
int[][] search = {{1,0},{-1,0},{0,1},{0,-1}};
LinkedList<int[]> list = new LinkedList<>();
//输入海域的像素点
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
arr[i][j] = sc.next()+"";
}
}
//海平面上升后的海域
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=0;k<search.length;k++){
if(arr[i][j].equals(".")){
int m = i+search[k][0];
int n = j+search[k][1];
if(m>=0 && m<N && n>=0 && n<N){
if(arr[m][n].equals("#")){
arr[m][n] = "*";
}
}
}
}
}
}
//输出海平面上升后的海域
/*for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
System.out.print(arr[i][j]);
}
System.out.println();
}*/
//广度优先搜索,查找岛屿数
int count = 0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(arr[i][j].equals("#")){
int[] point = {i,j};
list.add(point);
while(!list.isEmpty()){
int[] poll = list.poll();
arr[poll[0]][poll[1]] = "*";//将访问过的陆地设置为*
for(int k=0;k<search.length;k++){
int m = poll[0]+search[k][0];
int n = poll[1]+search[k][1];
if(m>=0 && m<N && n>=0 && n<N){
if(arr[m][n].equals("#")){//判断下一层是否是陆地,如果是则加入链表
int[] point2 = {m,n};
list.add(point2);
}
}
}
}
count++;//统计连续的岛屿数
}
}
}
System.out.println(count);
}
}