dfs模板题,向八个方向搜索,越界或不是水域则返回,为了避免计算重复,搜过的水域置-1
class Solution {
public:
vector<int> pondSizes(vector<vector<int>>& land) {
int n=land.size();
int m=land[0].size();
vector<int>ans;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(land[i][j]==0) ans.push_back(dfs(land,i,j,n,m)); //对水域搜
}
}
sort(ans.begin(),ans.end());
return ans;
}
int dfs(vector<vector<int>>& land,int i,int j,int n,int m)
{
if(i<0||i>=n||j<0||j>=m||land[i][j]!=0) return 0; //越界或当前不是水域
land[i][j]=-1; //搜过标记防止重复
int cnt=1;
for(int x=-1;x<=1;x++)
{
for(int y=-1;y<=1;y++)
{
if(x==0&&y==0) continue;
cnt+=dfs(land,i+x,j+y,n,m); //计算水域个数
}
}
return cnt;
}
};