题目如下:
四周的陆地不做统计,但是从四周开始,遇到陆地的话对向四面八方拓展判断是否与边界相连,用一个二维数组mark标记是否已经连接。
代码如下:
```cpp
class Solution {
public:
int mark[500][500]={0};
void DFS(int i,int j,vector<vector<int>>& grid){
mark[i][j]=1;//读到这块先标记。
//if判断是否在四周,防止越界。并且在往四周拓展的时候先判断一下叛变是否已经被标记,已标记就不走过去了,不然会无限循环。
if(i>0){
if(grid[i-1][j]==1&&mark[i-1][j]==0) DFS(i-1,j,grid);
}
if(i<grid.size()-1){
if(grid[i+1][j]==1&&mark[i+1][j]==0) DFS(i+1,j,grid);
}
if(j>0){
if(grid[i][j-1]==1&&mark[i][j-1]==0) DFS(i,j-1,grid);
}
if(j<grid[0].size()-1) {
if(grid[i][j+1]==1&&mark[i][j+1]==0) DFS(i,j+1,grid);
}
}
int numEnclaves(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
//下面两个for循环将四周走一遍。
for(int i=0;i<m;i++){
if(grid[i][0]==1) {
DFS(i,0,grid);
}
if(grid[i][n-1]==1) {
DFS(i,n-1,grid);
}
}
for(int i=0;i<n;i++){
if(grid[0][i]==1) DFS(0,i,grid);
if(grid[m-1][i]==1) DFS(m-1,i,grid);
}
int res=0;
//扫描二维数组,计数不通边界的陆地数量
for(int i=1;i<m-1;i++){
for(int j=1;j<n-1;j++){
if(grid[i][j]==1&&mark[i][j]==0){
res++;
}
}
}
return res;
}
};