岛屿数

岛屿数量
给定二维数组形式的岛屿和水域的组合
1代表陆地 陆地上下左右连接区域构成一个岛屿
0代表水域
求所有岛屿的总数
例如

1
2
3
4
5
1 1 1 0 0 
1 1 0 0 0
1 0 0 1 0
0 0 0 0 1
岛屿数量为3

分析

使用BFS或DFS搜索某点开始的整个岛屿 在标记数组中标记这个岛屿
遍历所有位置 发现新陆地(未被标记)就使结果加一

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//使用BFS
function BFS(arr,x,y,mark){
let dx = [-1,1,0,0]
let dy = [0,0,-1,1]
let q = []
q.push([x,y])
mark[x][y] = 1
while(q.length){
let x = q[0][0]
let y = q[0][1]
q.shift()
for(let i=0;i<4;i++){
let newx = x+dx[i]
let newy = y+dy[i]
if(newx<0||newx>=arr.length||newy<0||newy>=arr[0].length){
continue
}
if(arr[newx][newy]==1&&mark[newx][newy]==0){
mark[newx][newy] = 1
q.push([newx,newy])
}
}
//q.shift()
}
console.log(mark)
}


//使用DFS
function DFS(arr,x,y,mark) {
mark[x][y] = 1
let dx = [-1,1,0,0]
let dy = [0,0,-1,1]
for(let i=0;i<4;i++){
let newx = x+dx[i]
let newy = y+dy[i]
if(newx<0||newx>=arr.length||newy<0||newy>=arr[0].length){
continue
}
if(arr[newx][newy]==1&&mark[newx][newy]==0){
//mark[newx][newy] = 1
DFS(arr,newx,newy,mark)
}
}
//console.log(mark)
}

//主函数
function s(arr){
let nums = 0 //保存结果
let mark = []
for(let i=0;i<arr.length;i++){
mark[i] = []
for(let j=0;j<arr[0].length;j++){
mark[i][j]=0
}
}
console.log(mark)
for(let i=0;i<arr.length;i++){
for(let j=0;j<arr[0].length;j++){
if(mark[i][j]==0&&arr[i][j]==1){

DFS(arr,i,j,mark) //或BFS(arr,i,j,mark)
nums++
}
}
}
return nums
}