版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40788630/article/details/88932314
给出一个二维数组 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
- 所有行的大小都相同
标准的dfs,没啥好讲的
解题代码:
class Solution {
public:
void dfs(int i,int j,vector<vector<int>>& A){//dfs函数
A[i][j]=0;
if(i-1>=0&&A[i-1][j]==1)dfs(i-1,j,A);
if(j-1>=0&&A[i][j-1]==1)dfs(i,j-1,A);
if(i+1<A.size()&&A[i+1][j]==1)dfs(i+1,j,A);
if(j+1<A[i].size()&&A[i][j+1]==1)dfs(i,j+1,A);
return;
}
int numEnclaves(vector<vector<int>>& A) {
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
if(i==0||i==A.size()-1||j==0||j==A[i].size()-1){//判断此时是否是边缘
if(A[i][j]==1){
dfs(i,j,A);
}
}
}
}
int sum=0;
for(int i=0;i<A.size();i++){
for(int j=0;j<A[i].size();j++){
if(A[i][j]==1)sum++;
}
}
return sum;
}
};