题目
题目:计算岛屿的个数(Number of Islands)
描述:给一个 01 矩阵,求不同的岛屿的个数。0 代表海,1 代表岛,如果两个 1 相邻,那么这两个 1 属于同一个岛。我们只考虑上下左右为相邻。
leetcode题号——433,难度——easy
思路
通过遍历找到岛屿的边缘,然后用DFS深度优先搜索可以找到整个岛屿并将岛屿转变为海洋(同化方法防止重复计算),岛屿计数+1,继续向后搜索岛屿直到整个区域搜索完成。
Javascript实现:
//垂直或者水平方向,只有1的独立块有同个。(被0包括的1为一个块)
let grid = [
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1]
] // islands =3
grid = [
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1]
] // islands =2
grid = [
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0]
] // islands =1
grid = [
[1, 0, 1, 0, 1]
// [0, 0, 1, 0, 0],
// [0, 0, 0, 0, 0]
] // islands =3
let ilandCount = 0;
let row = grid.length
let col = grid[0].length
//DFS深度遍历,遍历过的1同化为0,然后递归方式遍历4个方向
function dfs(grid, i, j, row, col) {
console.log(i,j)
if (i >= row || i < 0 || j < 0 || j >= col || grid[i][j] === 0) {
console.log('false')
return false
}
console.log(`(${i},${j}),${grid[i][j]}`)
grid[i][j] = 0;
dfs(grid, i - 1, j, row, col)
dfs(grid, i + 1, j, row, col)
dfs(grid, i, j + 1, row, col)
dfs(grid, i, j - 1, row, col)
}
function main() {
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] === 1) {
dfs(grid, i, j, row, col)
ilandCount++;
}
}
}
console.log(grid)
console.log(ilandCount)
}
main();