diff --git a/problems/kamacoder/0099.岛屿的数量深搜.md b/problems/kamacoder/0099.岛屿的数量深搜.md index 06be9268..eed21eca 100644 --- a/problems/kamacoder/0099.岛屿的数量深搜.md +++ b/problems/kamacoder/0099.岛屿的数量深搜.md @@ -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