给出一个二维数组 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
所有行的大小都相同
C++
class Solution {
public:
void dfs(vector>& A, int i, int j, int& count, bool& flag)
{
if(1==A[i][j])
{
count++;
A[i][j]=-1;
if(false==flag)
{
if(i==0 || i==(A.size()-1) || j==0 || j==(A[0].size()-1))
{
flag=true;
}
}
if(i-1>=0)
{
dfs(A,i-1,j,count,flag);
}
if(i+1<=A.size()-1)
{
dfs(A,i+1,j,count,flag);
}
if(j-1>=0)
{
dfs(A,i,j-1,count,flag);
}
if(j+1<=A[0].size()-1)
{
dfs(A,i,j+1,count,flag);
}
}
}
int numEnclaves(vector>& A)
{
int m=A.size();
int n=A[0].size();
int res=0;
for(int i=0;i
python
class Solution:
def dfs(self,A,i,j,count,flag):
if 1==A[i][j]:
count+=1
A[i][j]=-1
if flag==False:
if 0==i or len(A)-1==i or 0==j or len(A[0])-1==j:
flag=True
if i-1>=0:
count,flag=self.dfs(A,i-1,j,count,flag)
if i+1<=len(A)-1:
count,flag=self.dfs(A,i+1,j,count,flag)
if j-1>=0:
count,flag=self.dfs(A,i,j-1,count,flag)
if j+1<=len(A[0])-1:
count,flag=self.dfs(A,i,j+1,count,flag)
return count,flag
def numEnclaves(self, A: List[List[int]]) -> int:
m=len(A)
n=len(A[0])
res=0
for i in range(m):
for j in range(n):
count=0
flag=False
count,flag=self.dfs(A,i,j,count,flag)
if False==flag:
res+=count
return res