您的位置:首页 > 其它

poj 1379 Run Away

2011-11-02 22:37 274 查看
给定n个点和区域大小,在区域内找到一个点,使得n个点到这个点的最小距离最大

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#define PI acos(-1.0)
using namespace std;

int t,x,y,m;
struct node
{
double x,y;
}point[20];
double u[1100],v[1100],ans[20];
void min_dis(double x,double y,double &inf)
{
int i;
inf=1e20;
for(i=0;i<m;i++)
{
double d=(x-u[i])*(x-u[i])+(y-v[i])*(y-v[i]);
if(inf>d)
inf=d;
}
}

int main()
{
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&x,&y,&m);
for(i=0;i<m;i++)
scanf("%lf%lf",&u[i],&v[i]);
srand((unsigned)time(NULL));
int p=10,l=30;
for(int i=0;i<p;i++)
{
point[i].x=(rand()%101)/100.0*x;
point[i].y=(rand()%101)/100.0*y;
min_dis(point[i].x,point[i].y,ans[i]);
}
double delta=(x>y?x:y)/sqrt(m*1.0),eps=1e-2;
while(delta>eps)
{
for(i=0;i<p;i++)
for(j=0;j<l;j++)
{
double an=(rand()%101)/100.0*2.0*PI;
double vx=point[i].x+delta*cos(an);
double vy=point[i].y+delta*sin(an);
if(vx<0 || vy<0 || vx>x || vy>y)
continue;
double inf;
min_dis(vx,vy,inf);
if(inf>ans[i])
{
ans[i]=inf;
point[i].x=vx;
point[i].y=vy;
}
}
delta*=0.8;
}
double inf=ans[0];
int k=0;
for(i=1;i<p;i++)
if(ans[i]>inf)
{
inf=ans[i];
k=i;
}
printf("The safest point is (%.1lf, %.1lf).\n",point[k].x,point[k].y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null