此题可以用dfs搜索,以当前位置为0向上下左右四个方向搜索,当前位置为0时,只有当前位置处于矩阵边界时,不满足此岛屿为封闭岛的条件,否则此岛必为封闭岛,现在要做的是去找和它相连的0,把这个最大的封闭岛找出来,并标记,防止在下一次更新当前位置时重复计算。
class Solution {
public:
int closedIsland(vector<vector<int>>& grid) {
int ans=0;
int m=grid.size();
int n=grid[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(grid[i][j]==0&&dfs(grid,i,j,m,n)) ans++; //以当前位置搜索,如果不是边界,答案++
}
}
return ans;
}
bool dfs(vector<vector<int>>& grid,int i,int j,int m,int n)
{
if(i<0||i>=m||j<0||j>=n) return false; //搜到边界不满足条件
if(grid[i][j]==0)
{
grid[i][j]=-1; //标记防止重复计算
int ans1=dfs(grid,i+1,j,m,n); //向四个方向搜索
int ans2=dfs(grid,i,j+1,m,n);
int ans3=dfs(grid,i-1,j,m,n);
int ans4=dfs(grid,i,j-1,m,n);
return ans1&&ans2&&ans3&&ans4;
}
else return true; //如果搜到1也返回true,因为只有边界是不满足条件的
}
};
此题只要当前位置是0且不为边界,答案肯定要+1,dfs的作用是将与当前位置相连的所有0标记,防止下次搜索时重复计算。