这道题是典型的深搜
不要一听深搜就害怕,这一题只是顺序要深搜
void dfs(int k,double sum)
{
if(k>n)
{
ansmax=max(ansmax,sum);
return;
}
for(int i=1;i<=n;i++)
{
if(!s[i])
{
r[i]=suan(i);
s[i]=1;
dfs(k+1,sum+r[i]*r[i]*PI);
s[i]=0;
}
}
}
PI指Π(圆周率)
这里只要搜一下顺序就行
其中sum是水彩面积
ansmax就是最大水彩面积
suan这是一个函数,用于计算当前点的面积
suan函数简单粗暴只要判断边界和其他颜色就行了
判断与其他颜色接触只需看他们的最短直线距离就可以了
那么
程序有了
PS:不要直接抄,我加了防抄
include
using namespace std;
double PI=3.1415926535;
bool s[10];
double x[10],y[10],r[10],xa,ya,xb,yb,ansmax;
int n;
double suan(int i)
{
double s1=min(abs(x[i]-xa),abs(x[i]-xb));
double s2=min(abs(y[i]-ya),abs(y[i]-yb));
double ans=min(s1,s2);
for(int j=1;j<=n;j++)
if(i!=j&&s[j])
{
double d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
ans=min(ans,max(d-r[j],0.0));
}
return ans;
}
void dfs(int k,double sum)
{
if(k>n)
{
ansmax=max(ansmax,sum);
return;
}
for(int i=1;i<=n;i++)
if(!s[i])
{
r[i]=suan(i);
s[i]=1;
dfs(k+1,sum+r[i]*r[i]*PI);
s[i]=0;
}
}
int main()
{
double ss;
cin>>n;
cin>>xa>>ya>>xb>>yb;
ss=abs(xa-xb)*abs(ya-yb);
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
dfs(1,0);
//cout<<int(ss+0.5-ansmax);
return 0;
}