(题目截图截自LeetCode)
题目对于封闭岛屿的要求是上下左右所有相邻区域都是水域,所以首先排除处于矩阵边框的陆地,设置一个flag,利用深搜判断陆地周围是否是陆地,如果不是的话结束本次搜索。封闭岛屿数加一;AC代码如下:
class Solution {
public:
void dfs(vector<vector<int>>& gird,size_t i,size_t j,bool &flag)
{
if(i>=gird.size()||j>=gird[0].size())//递归出口以及排除边框陆地区域
{
flag=false;
return;
}
if(gird[i][j]!=0)
return;
gird[i][j]=-1;//标记已经走过的区域
dfs(gird,i+1,j,flag);
dfs(gird,i,j+1,flag);
dfs(gird,i-1,j,flag);
dfs(gird,i,j-1,flag);
}
int closedIsland(vector<vector<int>>& grid) {
int ans=0;
for(size_t i=0;i<grid.size();i++)
for(size_t j=0;j<grid[0].size();j++)
{
if(grid[i][j]==0)//从陆地出发
{
bool flag=true;
dfs(grid,i,j,flag);
if(flag)ans++;
}
}
return ans;
}
};
因为对递归的运行原理至今还没理解透,所以描述解题思路的时候可能会有很多错误,所以路过的大佬看到了可以指正一下。