在一张给定的图上有至多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]); } }
原文:http://www.cnblogs.com/moris/p/4359928.html