有点皮的一道搜索或者是并查集的题目,我用的是并查集,参考了一下一个题解里的做法…毕竟一开始没读懂题只好看看别人咋写的。 这个周长其实是指所有冰淇淋的小component旁边的’.'这个东西,也就是说可以叠加,那么其实这个搞明白了就直接上并查集维护联通分量的大小以及面积即可
#include <iostream>
using namespace std;
#define MAXN 1905
int N,mp[MAXN][MAXN],fa[MAXN*MAXN];
int tot;
int findf(int x)
{
if(fa[x]==x)
return fa[x];
fa[x]=findf(fa[x]);
return fa[x];
}
int a[MAXN*MAXN],p[MAXN*MAXN];
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
int main()
{
int i, j, k;
cin>>N;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
char c;
cin>>c;
if(c=='#')
{
tot++;
mp[i][j]=tot;
}
}
}
for(i=1;i<=tot;i++)
{
fa[i]=i;
a[i]=1;
}
int maxa=0,minp=89999999;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
if(mp[i][j])
{
if(mp[i-1][j]&&i-1>=1)
{
int fx=findf(mp[i][j]);
int fy=findf(mp[i-1][j]);
if(fx!=fy)
{
a[findf(mp[i][j])]+=a[findf(mp[i-1][j])];
p[findf(mp[i][j])]+=p[findf(mp[i-1][j])];
fa[fy]=fx;
}
}
if(mp[i][j-1]&&j-1>=1)
{
int fx=findf(mp[i][j]);
int fy=findf(mp[i][j-1]);
if(fx!=fy)
{
a[findf(mp[i][j])]+=a[findf(mp[i][j-1])];
p[findf(mp[i][j])]+=p[findf(mp[i][j-1])];
fa[fy]=fx;
}
}
int e=4;
for(k=0;k<4;k++)
{
if(mp[i+dx[k]][j+dy[k]])
e--;
}
p[findf(mp[i][j])]+=e;
if(maxa<a[findf(mp[i][j])])
{
maxa=a[findf(mp[i][j])];
minp=p[findf(mp[i][j])];
}
else if(maxa==a[findf(mp[i][j])])
{
minp=min(minp,p[findf(mp[i][j])]);
}
}
}
}
cout<<maxa<<' '<<minp<<endl;
}