问题描述:
一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?
举例: 下面这个矩阵中有4个岛。
let arrIsland = [
[0,0,1,0,1,0],
[1,1,1,0,1,0],
[1,0,0,1,0,0],
[0,0,0,0,0,1]
];
实现思路:
1.遍历整个矩阵,当 arr[i][j] === 1 时,将其值改成2,同时 岛的数量 +1;
2.将这个位置的 上、下、左、右 的四个位置的值都检查一遍,(递归实现)
- 位置 i,j超出边界 或 该位置的值 不等于1,返回;
- 不是上面的情况,则:将该位置的值改为 2 ,再重复步骤2。
代码:
function islandCount(arr){
if (!arr || arr.length === 0) {
return;
};
let N = arr.length, M = arr[0].length, res = 0;
for(let i = 0; i < N; i++){
for(let j = 0; j < M; j++){
if (arr[i][j] === 1) {
++res;
infect(arr,i,j,N,M);
}
}
}
return res;
}
function infect(arr,i,j,N,M){
if (i < 0 || j < 0 || i >= N || j >= M || arr[i][j] !== 1) {
return;
};
arr[i][j] = 2;
infect(arr,i,j-1,N,M);
infect(arr,i+1,j,N,M);
infect(arr,i,j+1,N,M);
infect(arr,i-1,j,N,M);
}
let arrIsland = [
[0,0,1,0,1,0],
[1,1,1,0,1,0],
[1,0,0,1,0,0],
[0,0,0,0,0,1]
];
console.log(islandCount(arrIsland)); // 4