题目
给定一个m行n列的二维地图,初始化每个单元都是水,操作addLand把单元格(row,col)变成陆地。岛屿定义为一系列想连的被水单元包围的陆地单元,横向和纵向相邻的陆地称为相连(斜对角不算)。在一系列addLand的操作过程中,给出每次addLand的操作后的岛屿的个数。二维地图的每条边外侧假定都是水。
样列
输入 (行,列,addLand操作次数,addLand每次操作的坐标)
3
3
4
0 0
0 1
1 2
2 1
输出(每次addLand后岛屿的个数)
1 1 2 3
代码
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
int n = scan.nextInt();
int num = scan.nextInt();
int[][] nums = new int[num][2];
for(int i=0;i<num;i++){
nums[i][0] = scan.nextInt();
nums[i][1] = scan.nextInt();
}
int[][] ceils = new int[m+2][n+2];
for(int i=0;i<n+2;i++){
// 初始化第一行
ceils[0][i] = 0;
// 初始化最后一行
ceils[n+1][i] = 0;
}
for(int i=0;i<m+2;i++){
// 初始化第一列
ceils[i][0] = 0;
// 初始化最后一列
ceils[i][m+1] = 0;
}
int[] result = new int[num];
for(int i=0;i<num;i++){
if(nums[i][0]<0 || nums[i][0]>m || nums[i][1]<0 || nums[i][1]>n){
continue;
}
int row = nums[i][0]+1;
int col = nums[i][1]+1;
ceils[row][col] = 1;
if(ceils[row-1][col] == 0 &&
ceils[row+1][col] == 0 &&
ceils[row][col-1] == 0 &&
ceils[row][col+1] == 0){
if(i==0){
result[i] = 1;
continue;
}
result[i] = result[i-1]+1;
} else {
result[i] = result[i-1];
}
}
for(int i=0;i<num;i++){
if(i==0){
System.out.print(result[i]);
continue;
}
System.out.print(" " + result[i]);
}
}
}