首页 > 其他 > 详细

SPOJ Problem 34:Run Away

时间:2015-03-23 15:48:15      阅读:185      评论:0      收藏:0      [点我收藏+]

在一张给定的图上有至多1000个陷阱,要求距离每个陷阱最大的点,或者说到最近的陷阱距离最大。

第一次打模拟退火。。虽说看了一会其他人给出的程序,但至少大部分都是自己打的。。

教程网上基本上都有,不过感觉这个比较好。

http://blog.csdn.net/acm_ted/article/details/7953157

#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iostream>
#define inf 1e20
#define eps 1e-3
#define pi (acos(-1.0))
using namespace std;
double x[1005],y[1005],px[40],py[40],d[40],dx,dy,tx,ty,rx,ry,cnt;
int i,j,k,t;
double dist(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
    scanf("%d",&t);
    while(t--){
        srand((unsigned)time(NULL));
        int n;
        scanf("%lf%lf%d",&dx,&dy,&n);
        for (i=0;i<n;i++)
            scanf("%lf%lf",x+i,y+i);
        for    (i=0;i<35;i++){
            px[i]=double(rand()%1000)/1000*(dx*1.0);
            py[i]=double(rand()%1000)/1000*(dy*1.0);
            d[i]=inf;
            for (j=0;j<n;j++)
                d[i]=min(d[i],dist(x[j],y[j],px[i],py[i]));
        }
        double delta=double(max(dx,dy))/sqrt(n*1.0); 
        while(delta>eps){
            for (i=0;i<35;i++){
                tx=px[i];
                ty=py[i];
                for (j=0;j<=35;j++){
                    cnt=double(rand()%1000)/1000*10*pi;
                    rx=tx+delta*cos(cnt);
                    ry=ty+delta*sin(cnt);
                    if (rx>dx||rx<0||ry>dy||ry<0)continue;
                    double dis=inf;
                    for (k=0;k<n;k++)
                        dis=min(dis,dist(x[k],y[k],rx,ry));
                    if (dis>d[i]){d[i]=dis;px[i]=rx;py[i]=ry;}
                }
            }
            delta*=0.8;
        }
        double dis=0;
        int k;
        for (i=0;i<35;i++)
            if (d[i]>dis){
                dis=d[i];
                k=i;
            }
        printf("The safest point is (%.1lf, %.1lf).\n",px[k],py[k]);
    }
}

 

SPOJ Problem 34:Run Away

原文:http://www.cnblogs.com/moris/p/4359928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!