岛屿的周长——模拟遍历 || DFS

80 阅读1分钟

image.png

迭代模拟

  1. type一个pair类型,x,y
  2. 新建一个pair类型的数组,表示四个方向,上移,下移,左移,右移
  3. 遍历grid,当值为1时,判断其四个方向是否满足边界或值为0,满足则ans++
  4. 判断四个方向则通过遍历dir4这个数组,让i,j与数组内的值相加得到四个方向的坐标
type pair struct{ x, y int }
var dir4 = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

func islandPerimeter(grid [][]int) (ans int) {
    n, m := len(grid), len(grid[0])
    for i, row := range grid {
        for j, v := range row {
            if v == 1 {
                for _, d := range dir4 {
                    if x, y := i+d.x, j+d.y; x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0 {
                        ans++
                    }
                }
            }
        }
    }
    return
}

DFS

  1. 迭代模拟算层序遍历吧,,,
  2. dfs找到第一个陆地
  3. 然后dfs第一个陆地
  4. 防止重复遍历陆地,将遍历过的陆地标记为2
  5. 如果当前陆地未被标记则dfs当前陆地
  6. 如果某个方向满足条件,则ans++,并且直接return,因为满足条件则表示dfs的最深处
type pair struct{ x, y int }
var dir4 = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

func islandPerimeter(grid [][]int) (ans int) {
    n, m := len(grid), len(grid[0])
    var dfs func(x, y int)
    dfs = func(x, y int) {
        if x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0 {
            ans++
            return
        }
        if grid[x][y] == 2 {
            return
        }
        grid[x][y] = 2
        for _, d := range dir4 {
            dfs(x+d.x, y+d.y)
        }
    }
    for i, row := range grid {
        for j, v := range row {
            if v == 1 {
                dfs(i, j)
                return // 直接返回,因为只有一个岛屿
            }
        }
    }
    return
}