给定一个m行n列的二维地图, 初始化每个单元都是水.
操作addLand 把单元格(row,col)变成陆地.
岛屿定义为一系列相连的被水单元包围的陆地单元, 横向或纵向相邻的陆地称为相连(斜对角不算).
在一系列addLand的操作过程中, 给出每次addLand操作后岛屿的个数.
二维地图的每条边界外侧假定都是水.
输入描述:
多组测试数据,请参考例题处理 每组数据k+3行, k表示addLand操作次数 第一行:表示行数m 第二行:表示列数n 第三行:表示addLand操作次数k 第4~k+3行:row col 表示addLand的坐标。注意超过边界的坐标是无效的。
输出描述:
一行,k个整数, 表示每次addLand操作后岛屿的个数, 用空格隔开,结尾无空格
输入例子1:
3
3
4
0 0
0 1
1 2
2 1
输出例子1:
1 1 2 3
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int m = sc.nextInt();
int n = sc.nextInt();
int k = sc.nextInt();
int count = 0;
int[][] island = new int[m][n];
int[][] num = new int[k][2];
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < k; i++){
num[i][0] = sc.nextInt();
num[i][1] = sc.nextInt();
}
for(int i = 0; i < k; i++){
int a = num[i][0];
int b = num[i][1];
if(a < 0 || b < 0 || a >= m || b >= n){
list.add(count);
continue;
}
if(island[a][b] == 1){
list.add(count);
continue;
}
island[a][b] = 1;
if(a - 1 >= 0 && island[a - 1][b] == 1){
if(count != 0) count--;
}
if(a + 1 < m && island[a + 1][b] == 1){
if(count != 0) count--;
}
if(b - 1 >= 0 && island[a][b - 1] == 1){
if(count != 0) count--;
}
if(b + 1 > n && island[a][b + 1] == 1){
if(count != 0) count--;
}
count++;
list.add(count);
}
for(int i = 0; i < list.size() - 1; i ++){
System.out.print(list.get(i) + " ");
}
System.out.print(list.get(list.size() - 1));
System.out.println();
}
}
}
459

被折叠的 条评论
为什么被折叠?



