给出一个二维数组 A
,每个单元格为 0(代表海)或 1(代表陆地)。
移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。
返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 1:
输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:
有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:
输入:[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:
所有 1 都在边界上或可以到达边界。
提示:
1 <= A.length <= 500
1 <= A[i].length <= 500
0 <= A[i][j] <= 1
- 所有行的大小都相同
思路:
对四条边上的1进行DFS找所有能到达的1, 找到了满足条件的1,就把它染色成2。
最后所有能接触到边界的1,都会被染色成2,剩下来的飞地,值就还是1,
统计一下1的个数即可。
class Solution(object):
def numEnclaves(self, A):
"""
:type A: List[List[int]]
:rtype: int
"""
m, n = len(A), len(A[0])
def dfs(x, y):
dx = [0, 1, -1, 0]
dy = [-1, 0, 0, + 1]
for k in range(4):
xx = x + dx[k]
yy = y + dy[k]
if xx >= 0 and xx < m and yy >= 0 and yy < n: #当前坐标有效
if A[xx][yy] == 1:
A[xx][yy] = 2 #给走过的点染色
dfs(xx, yy)
#--------以下在从四周往里找相邻的所有点
i = 0
for j in range(n): #上边
if A[i][j] == 1:
A[i][j] = 2
dfs(i, j)
i = m - 1
for j in range(n): #下边
if A[i][j] == 1:
A[i][j] = 2
dfs(i, j)
j = 0
for i in range(m): #左边
if A[i][j] == 1:
A[i][j] = 2
dfs(i, j)
j = n - 1
for i in range(m): #右边
if A[i][j] == 1:
A[i][j] = 2
dfs(i, j)
#--------以上在从四周往里找相邻的所有点
res = 0
for i in range(m):
for j in range(n):
if A[i][j] == 1: #统计一下还有多少个没有去过的点
res += 1
return res