首页 > 代码库 > poj1379 模拟退火
poj1379 模拟退火
1 //Accepted 220 KB 829 ms 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <ctime> 6 #include <cstdlib> 7 #include <iostream> 8 using namespace std; 9 const int iL=30;10 const int iP=30;11 const double inf=10000000.0;12 const double Pi=acos(-1.0);13 int n;14 int T;15 double boundary_x,boundary_y;16 int cnt;17 double hole_x[1005],hole_y[1005];18 double x[iP],y[iP],dis[iP];19 double min(double a,double b)20 {21 if (a-b<1e-12)22 return a;23 return b;24 }25 double get_dis(double x1,double y1,double x2,double y2)26 {27 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));28 }29 void sa()30 {31 srand(time(NULL));32 for (int i=0;i<iP;i++)33 {34 x[i]=double(rand()%1000+1)/1000.0*boundary_x;35 y[i]=double(rand()%1000+1)/1000.0*boundary_y;36 dis[i]=inf;37 for (int j=0;j<cnt;j++)38 {39 if (dis[i]>get_dis(x[i],y[i],hole_x[j],hole_y[j]))40 dis[i]=get_dis(x[i],y[i],hole_x[j],hole_y[j]);41 }42 }43 double delta=sqrt(boundary_x*boundary_x+boundary_y*boundary_y);44 while (delta>0.0001)45 {46 for (int i=0;i<iP;i++)47 {48 double temp_x=x[i],temp_y=y[i],temp_dis=dis[i];49 for (int j=0;j<iL;j++)50 {51 double theta=double(rand()%1000+1)/1000.0*2*Pi;52 double nx=x[i]+delta*cos(theta);53 double ny=y[i]+delta*sin(theta);54 if (nx<0 || nx>boundary_x || ny<0 || ny>boundary_y)55 continue;56 double ndis=inf;57 for (int k=0;k<cnt;k++)58 ndis=min(ndis,get_dis(nx,ny,hole_x[k],hole_y[k]));59 if (ndis>temp_dis)60 {61 temp_dis=ndis;62 temp_x=nx;63 temp_y=ny;64 }65 }66 x[i]=temp_x;67 y[i]=temp_y;68 dis[i]=temp_dis;69 }70 delta*=0.8;71 }72 }73 int main()74 {75 scanf("%d",&T);76 while (T--)77 {78 scanf("%lf%lf%d",&boundary_x,&boundary_y,&cnt);79 for (int i=0;i<cnt;i++)80 scanf("%lf%lf",&hole_x[i],&hole_y[i]);81 sa();82 int tid;83 double temp_dis=0;84 for (int i=0;i<iP;i++)85 {86 if (dis[i]>temp_dis)87 {88 tid=i;89 temp_dis=dis[i];90 }91 }92 printf("The safest point is (%.1lf, %.1lf).\n",x[tid],y[tid]);93 }94 return 0;95 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。