力扣1020. 飞地的数量
本题和第29天的黄金矿工很像,可以直接套用广度优先的模版实现。对于具体实现是与黄金矿工那道题有区别的。首先进入点是从网格边界进入,即第一行,最后一行,第一列,最后一列这四条边上的网格进入,在边界搜索1,并将走过路径标记为“0”,走过的路径意味着这条路是可以离开网格的。遍历网格,其中剩余1的个数即为无法离开网格的陆地的个数。
from typing import List
def numEnclaves(grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
res = 0
def dfs(x: int, y: int):
grid[x][y] = 0 # 将经过的岛屿标记为0
for nx, ny in ((x-1, y), (x+1, y), (x, y-1), (x, y+1)): # 上下左右四个前进方向
if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == 1:
dfs(nx, ny)
# 从网格边界四条边开始
for j in range(n):
if grid[0][j] == 1: # 第一行
dfs(0, j)
if grid[m-1][j] == 1: # 最后一行
dfs(m-1, j)
for i in range(m):
if grid[i][0] == 1: # 第一列
dfs(i, 0)
if grid[i][n-1] == 1: # 最后一列
dfs(i, n-1)
# 统计整个grid剩下的1的个数
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
res += 1
return res
grid = [[0, 0, 0, 0], [1, 0, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]
print(numEnclaves(grid)) # 3
END