我的主题思路是第一个dfs分出水洼块,第二个dfs把每块水洼的哈希值设为所在大水洼的总水洼数。times用来区分不同的大水洼。
然后遍历,具体见代码 48~63 行
最后特判一下总体水洼的情况(最后一个for)
代码:
#include<iostream>
#include<cstring>
using namespace std;
long long n;
bool a[3000][3000];
int dh[3000][3000],times[3000][3000],cnt;
int ans[9000000],sum;
int ans2[9000000];
void dfs(int x,int y){
if(x<1||x>n||y<1||y>n||dh[x][y]||!a[x][y])return;
sum++;
dh[x][y]=1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
}
void Dfs(int x,int y){
// cout<<" - "<<x<<' '<<y<<' '<<dh[x][y]<<endl;
if(x<1||x>n||y<1||y>n||dh[x][y]==0||dh[x][y]==sum)return;
// cout<<x<<' '<<y<<endl;
dh[x][y]=sum;
times[x][y]=cnt;
Dfs(x+1,y);
Dfs(x-1,y);
Dfs(x,y+1);
Dfs(x,y-1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]&&!dh[i][j]){
// memset(dh,0,sizeof dh);
sum=0;
dfs(i,j);
cnt++;
Dfs(i,j);
// cout<<endl;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dh[i][j]==0){
if(times[i-1][j]!=times[i+1][j])
if(i>1&&i<n)
ans[dh[i-1][j]+dh[i+1][j]+1]++;
if(times[i][j-1]!=times[i][j+1])
if(j>1&&j<n)
ans[dh[i][j-1]+dh[i][j+1]+1]++;
}else{
ans2[dh[i][j]]=dh[i][j];
}
// cout<<dh[i][j]<<' ';
}
// cout<<endl;
}
for(int i=8000000;i;i--){
if(ans[i]>0){
cout<<i<<' '<<ans[i];
return 0;
}
}
for(int i=8000000;i;i--){
if(ans2[i]>0){
cout<<i<<' '<<ans2[i];
return 0;
}
}
}