题目:
给你一个由
'1'
(陆地)和'0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"] ] 输出:1示例 2:
输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ] 输出:3
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j]
的值为'0'
或'1'
代码:
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
let m = grid.length,n = grid[0].length
let num = 0
// 改变网格岛屿函数
var change = function(i,j){
let stack = [[i,j]]
// 四个方向
let direction = [[-1,0],[0,1],[1,0],[0,-1]]
// 栈空了则退出循环
while(stack.length!=0){
//取出栈第一个元素
let [a,b] = stack.shift()
for(let k = 0 ; k<4; k++ ){
// 算出对应位置的坐标
let a1 = a+direction[k][0] , b1 = b+direction[k][1]
if(a1>=0&&a1<m&&b1>=0&&b1<n){
if(grid[a1][b1]==1){
// 如果该元素为1,则入栈且赋值0
grid[a1][b1] = 0
stack.push([a1,b1])
}
}
}
}
}
for(let i = 0 ; i < m ; i++){
for(let j = 0 ; j <n ; j++ ){
if(grid[i][j]==1){
//找到网格为陆地
num++
grid[i][j]=='0'
//将该元素所有相连的1全部置为0
change(i,j)
}
}
}
return num
};