zoukankan      html  css  js  c++  java
  • POJ2069 最小球体覆盖, 模拟退火

    只是套了个模板,模拟退火具体的过程真心不懂阿

     1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
     2 #include <stdio.h>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <stack>
     7 #include <queue>
     8 #include <vector>
     9 #include <algorithm>
    10 #define ll long long
    11 #define Max(a,b) (((a) > (b)) ? (a) : (b))
    12 #define Min(a,b) (((a) < (b)) ? (a) : (b))
    13 #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    14 using namespace std;
    15 
    16 const int INF = 0x3f3f3f3f;
    17 const int MAXN = 220;
    18 const double eps = 1e-8;
    19 int n;
    20 struct POINT{
    21     double x,y,z;
    22 }ps[35],q;
    23 
    24 double dist(POINT a,POINT b){
    25     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
    26 }
    27 
    28 int maxD(POINT p){
    29     double res = 0;
    30     int i, k = 0;
    31     for(i = 0; i < n ; ++i){
    32         double tmp = dist(p,ps[i]);
    33         if(tmp > res){
    34             k = i;
    35             res = dist(p,ps[i]);
    36         }
    37     }
    38     return k;
    39 }
    40 
    41 double BallCover(){
    42     double step = 100, ans = INF;
    43     q.x = q.y = q.z = 0.0;
    44     while(step > eps){
    45         int d = maxD(q);
    46         double tmp = dist(ps[d],q);
    47         if(tmp < ans) ans=tmp;
    48         double dx = ps[d].x - q.x;
    49         double dy = ps[d].y - q.y;
    50         double dz = ps[d].z - q.z;
    51         dx /= tmp;
    52         dy /= tmp;
    53         dz /= tmp;
    54         q.x += (dx*step);
    55         q.y += (dy*step);
    56         q.z += (dz*step);
    57         step *= 0.98;
    58     }
    59     return ans;
    60 }
    61 
    62 int main(){
    63     int i;
    64     while(EOF != scanf("%d",&n)){
    65         if(0 == n)  break;
    66         for(i = 0; i < n ; ++i)
    67             scanf("%lf%lf%lf",&ps[i].x,&ps[i].y,&ps[i].z);
    68         printf("%.5f
    ",BallCover());
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    C++STL——vector
    大数常用计算模板及例题
    在线算法&离线算法
    线段树——hdu1166敌兵布阵
    C++STL——堆栈
    C++STL——优先队列
    C++STL——队列
    图的建立——图的两种存储结构
    Manacher算法——最长回文子串
    HttpClient的几个实现类
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3939217.html
Copyright © 2011-2022 走看看