做笔记。
给你一个长方形,和长方形里面的一些点,每个点可以放置一个油滴,油滴可以扩展,知道遇到边界或者其他的油滴才会停止扩展,要你选择最合适的顺序放置油滴使得剩下的区域最小。
要求输出剩下的最小的面积
其实就是一个深搜的题目(或者是求全排列),搜出所有情况,然后取最大的面积就好了
#include<cmath> #include<iostream> #define PI 3.14159265358 using namespace std; const int N=10; double xa,ya,xb,yb; int n; double x[N],y[N]; double r[N]; bool vis[N]; double res=0; double cal(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&&vis[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))//如果此时的油滴已经在某个油滴扩展区域的内部了,通过max将其pass掉 } } return ans; } void dfs(int now,double sum)//常规搜索 { if(now>n) { res=max(res,sum); return; } for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=true; r[i]=cal(i); dfs(now+1,sum+PI*r[i]*r[i]); vis[i]=false; } } } int main(void) { cin>>n; cin>>xa>>ya>>xb>>yb; int s=abs(xa-xb)*abs(ya-yb); for(int i=1;i<=n;i++) cin>>x[i]>>y[i]; dfs(1,0); cout<<int(s-res+0.5); return 0; }