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; }
相关文章推荐
- poj 1379 Run Away 模拟退火 难度:1
- 【POJ1379】Run Away 模拟退火
- POJ 1379 Run Away 模拟退火
- POJ 1379-Run Away解题报告
- POJ 1379 Run Away
- poj 1379 Run Away 随机化变步长贪心
- 【模拟退火】 poj1379 Run Away
- poj 1379 Run Away
- POJ 1379 Run Away 【基础模拟退火】
- POJ 1379 Run Away(模拟退火)
- POJ 1379 Run Away 模拟退火
- POJ 1379 Run Away 笔记
- POJ 1379 Run Away
- poj 1379 Run Away
- [poj 1379]Run Away[模拟退火]
- [模拟退火 || Voronoi图] POJ 1379 Run Away
- poj 1379 Run Away 模拟退火
- poj_1379_run away
- [POJ1379 Run Away]
- poj1379——Run Away