在完成了上一道题目的基础上 LeetCode:1254. 统计封闭岛屿的数目,我们只需要删去一行代码又可以完成这道题目了哈哈哈
前面的题都是问你求岛屿的数量,岛屿就是那些土地连在一起,一块一块的。而这道题问的是你土地的数量,同样的不包括边缘的土地
那么这道题就很简单了,只要做了上道题,我们知道把整个图遍历的过程中就会把用不上的土地(边缘土地),和原本的海水都填成海水,那么当走到所求结果的土地时我们dfs,如果顺利那么计数器++,就说明这是一块岛屿。而这道题不问岛屿,问土地,那么久更简单了,我们走到结果土地的时候都不要dfs,只需要继续遍历看他有几块土地,计数器++就好,因为其他地方用不上的土地(边缘土地)在我们进行检查的时候都被填成海了
说到这里,估计就明白了,这道题的代码就是把上道题for循环的dfs删去就可以了
class Solution {
public:
void DFS(vector<vector<int>>& grid,int i,int j )
{
if(i>=grid.size()||j>=grid[0].size()||i<0||j<0)
{
return ;
}
if(grid[i][j]==0)return ;//已经是海水了
grid[i][j]=0;//淹了
DFS(grid,i-1,j);
DFS(grid,i+1,j);
DFS(grid,i,j-1);
DFS(grid,i,j+1);
}
int numEnclaves(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
for(int j=0;j<n;++j)
{
DFS(grid,0,j);//把最上边的岛给淹了
DFS(grid,m-1,j);//最下面的淹了
}
for(int i=0;i<m;++i)
{
DFS(grid,i,0);//最左边的淹了
DFS(grid,i,n-1);//最右边的给淹了
}
//这里上面的边缘土地,海水都被填成海水了
//下面遍历求土地就行
int count=0;
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
if(grid[i][j]==1)
{
count++;
}
}
}
return count;
}
};