给出一个二维数组 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
所有行的大小都相同
class Solution {
private:
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
public:
bool Vaild(int row,int col,int Row,int Col){
return (row>=0&&row<Row&&col>=0&&col<Col);
}
void dfs(vector<vector<int>>& A,int row,int col, int Row, int Col){
if(!Vaild(row,col,Row,Col)||A[row][col]!=1){
return;
}
A[row][col]=-1000;
/**开始遍历方向*/
for(int i=0;i<4;i++){
int nrow = row+dir[i][0];
int ncol = col+dir[i][1];
dfs(A,nrow,ncol,Row,Col);
}
return;
}
int numEnclaves(vector<vector<int>>& A) {
if(A.empty()){
return 0;
}
int Row = A.size();
int Col = A[0].size();
/**从四个边开始dfs*/
for(int i=0;i<Col;i++){
dfs(A,0,i,Row,Col);
dfs(A,Row-1,i,Row,Col);
}
/**左右两个边的遍历*/
for(int j=0;j<Row;j++){
dfs(A,j,0,Row,Col);
dfs(A,j,Col-1,Row,Col);
}
/**统计未遍历到的1*/
int ans = 0;
for(int i=0;i<Row;i++){
for(int j=0;j<Col;j++){
if(A[i][j]==1){
ans++;
}
}
}
return ans;
}
};
作者:he-zi-11
链接:https://leetcode-cn.com/problems/number-of-enclaves/solution/jiu-shi-jin-ke-neng-de-cong-si-ge-bian-bian-li-dao/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。