码迷,mamicode.com
首页 > 其他好文 > 详细

P1378 油滴扩展 - DFS

时间:2018-08-11 20:57:20      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:show   eof   std   扩展   半径   main   dfs   span   思路   

传送门

思路:由于n<=6,我们可以枚举油滴放置顺序的排列,然后DFS。对于每个油滴,其能扩散的最小半径为min{到四个边界的距离,到已添加的点的扩散范围的最小距离}。最后注意四舍五入:printf("%d",(int)ans+0.5);(其中ans为double类型)。

AC Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double pi=3.1415926535;
int n;
int a[10];
struct node{
    double x,y;
}o[10];
double ans=1e9;
double x,y,xx,yy;
double minr[10];
void dfs(int u,double res){
    if(u==n+1){
        ans=min(ans,res);
        return;
    }
    double X=o[a[u]].x,Y=o[a[u]].y;
    double r=min(fabs(X-x),min(fabs(X-xx),min(fabs(Y-y),fabs(Y-yy))));
    for(int i=1;i<u;i++){
        double xi=o[a[i]].x,yi=o[a[i]].y;
        double dis=sqrt((X-xi)*(X-xi)+(Y-yi)*(Y-yi));
        if(dis<=minr[a[i]]){
            minr[a[u]]=0;
            dfs(u+1,res);
            return ;
        }
        else {
            r=min(r,fabs(dis-minr[a[i]]));
        }
    }
    minr[a[u]]=r;
    dfs(u+1,res-pi*r*r);
    return ;
}
int main(){
    scanf("%d",&n);
    scanf("%lf%lf%lf%lf",&x,&y,&xx,&yy);
    for(int i=1;i<=n;i++){
        a[i]=i;
        scanf("%lf%lf",&o[i].x,&o[i].y);
    }
    double s=(fabs(xx-x)*fabs(yy-y));
    do{
        memset(minr,0,sizeof(minr));
        dfs(1,s);
    }while(next_permutation(a+1,a+n+1));
    printf("%d",(int)(ans+0.5));
    return 0;
}

 

P1378 油滴扩展 - DFS

标签:show   eof   std   扩展   半径   main   dfs   span   思路   

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9460908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!