1020.飞地的数量

50 阅读1分钟

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

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

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
算法:
从所有边界开始搜索,能到达的岛屿全部置-1,最后统计grid中1的数目

func numEnclaves(grid [][]int) int {
	n := len(grid)
	m := len(grid[0])
	dicts := [][]int{[]int{1,0},[]int{-1,0},[]int{0,1},[]int{0,-1}}
	var dfs func (i, j int)
	dfs = func(i, j int) {
		if 0 <= i && i < n && 0 <= j && j < m && grid[i][j] == 1 {
			grid[i][j] = -1
			for k := range dicts {
				x, y := i + dicts[k][0], j + dicts[k][1]
				dfs(x, y)
			}
		}
	}
	for i := range grid {
		for j := range grid[i] {
			if i == 0 || j == 0 || i == n -1 || j == m - 1 {
				dfs(i, j)
			}
		}
	}
	count := 0 
	for i := range grid {
		for j := range grid[i] {
			if grid[i][j] == 1 {
				count ++
			}
		}
	}
	return count
}