增加岛屿数量深搜go版本

This commit is contained in:
lylain
2025-03-18 12:10:20 +08:00
parent 86a0208485
commit 6d50f4735a

View File

@@ -326,6 +326,75 @@ if __name__ == '__main__':
### Go
我们使用一个visited数组记录下那些位置被遍历过。分为两层遍历。初始化一个visited数组和原始的grid一样大用来记录哪些陆地被遍历过
第一层遍历遍历整个grid数组的元素遇到陆地就在对应的visited数组里标记并且执行深度搜索深搜的逻辑是把当前位置的4个方向上的位置全部判断一遍看是不是陆地如果是则在这个位置上再执行深搜达到递归深搜的效果。所以深搜函数里是递归的。
```go
package main
import (
"fmt"
)
func visitIsland(grid [][]int) int {
row := len(grid)
if row == 0 {
return 0
}
visited := make([][]bool, row)
//go的这种初始化方式真的丑陋
for i := 0; i < row; i++ {
visited[i] = make([]bool, len(grid[0]))
}
ans := 0
for i := 0; i < row; i++ {
for j := 0; j < len(grid[0]); j++ {
if grid[i][j] == 1 && !visited[i][j] {
visited[i][j] = true
ans++
visitGrid(grid, visited, i, j)
}
}
}
return ans
}
func visitGrid(grid [][]int, visited [][]bool, x int, y int) {
diff := [4][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
for _, arr := range diff {
nextX := x + arr[0]
nextY := y + arr[1]
if nextX < 0 || nextX >= len(grid) || nextY < 0 || nextY >= len(grid[0]) {
continue
}
if !visited[nextX][nextY] && grid[nextX][nextY] == 1 {
visited[nextX][nextY] = true
visitGrid(grid, visited, nextX, nextY)
}
}
}
func main() {
var row, col int
fmt.Scan(&row, &col)
if row <=0 || col <=0 {
return
}
grid := make([][]int, row)
for i := 0; i < row; i++ {
grid[i] = make([]int, col)
}
for i := 0; i < row; i++ {
for j := 0; j < col; j++ {
fmt.Scan(&grid[i][j])
}
}
//这里必须要打印,不然报错会显示潜在的数组越界
fmt.Println(visitIsland(grid))
}
```
### Rust
### JavaScript