问题描述
11000
01001
00100
00010
求上面的孤岛的个数(0代表水,1代表陆地,当1上下左右全为0时,1成为孤岛,如果几个1连在一起,四周全是0,也是孤岛,上面的数字的边界默认为0)
解题思路
- 创建一个二维数组,先遍历,从[0][0]开始;
- 若为1,则将1改成2,然后执行 4 流程;
- 若为0或2则继续遍历,继续 2 流程;
- 如果旁边有1,则向旁边移动,直到碰到0时候停止;
- 将所有相连的都走一遍,无路可走时,此次相连的就是一个孤岛;
- 继续 3 流程,直到遍历完;
- 无路可走的次数就是孤岛的个数;
代码实现
public void doTest(int[][] arr) {
int num =0;//孤岛个数
for(int i=0;i < arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
//当数为1时,此时是一个孤岛的开始
if(arr[i][j]==1) {
load(arr,i,j);
num++;
}
}
}
System.out.println(num);
}
private void load (int[][] arr,int a,int b) {
//当走到边界,或者这个数不是1(已经走过的,或者是水)时,直接返回
if(a<0 || a>=arr.length || b<0 || b>=arr[a].length || arr[a][b] != 1) {
return;
}else {
arr[a][b]=2; //走过的全部标记成2,然后向四周走
load(arr,a,b+1);
load(arr,a,b-1);
load(arr,a+1,b);
load(arr,a-1,b);
}
}