1020. 飞地的数量

134 阅读1分钟

题目:
给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/nu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决:

func numEnclaves(grid [][]int) int {
    m := len(grid)
    n := len(grid[0])
    visitd := make([][]bool, m)
    for i := range visitd {
        visitd[i] = make([]bool, n)
    }
    for i := 0; i < m; i ++ {
        dfs(grid, visitd, m, n, i, 0)
        dfs(grid, visitd, m, n, i, n - 1)
    }
    for i := 0; i < n; i ++ {
        dfs(grid, visitd, m, n, 0, i)
        dfs(grid, visitd, m, n,  m - 1, i)
    }
    ans := 0
    for i := 1; i < m; i ++ {
        for j := 1; j < n ; j ++ {
            if !visitd[i][j] && grid[i][j] == 1 {
                ans ++
            }
        }
    }
    return ans 
}

func dfs(grid [][]int, visitd [][]bool, m, n, i, j int) {
    if i < 0 || m <= i || j < 0 || n <= j || grid[i][j] == 0 ||visitd[i][j] {
        return
    }   
    visitd[i][j] = true
    dfs(grid, visitd, m, n, i - 1, j)
    dfs(grid, visitd, m, n, i + 1, j)
    dfs(grid, visitd, m, n, i, j - 1)
    dfs(grid, visitd, m, n, i, j + 1)
}