問題描述:
一個矩陣中只有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