UVA 10005 Packing polygons(最小圆覆盖)

Posted carered

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 10005 Packing polygons(最小圆覆盖)相关的知识,希望对你有一定的参考价值。

技术图片

裸的模板题

AC代码:

  1 #include<cstdio>
  2 #include<cmath>
  3 #include<algorithm>
  4 #include<iostream>
  5 #include<cstring>
  6 using namespace std;
  7 typedef long long ll;
  8 const double eps = 1e-8;
  9 const double pi = acos(-1.0);
 10 const int maxp = 5000;
 11 int sgn(double x)
 12 
 13     if(fabs(x) < eps) return 0;
 14     else return x < 0 ? -1 : 1;
 15 
 16 struct Point
 17     double x, y;
 18     Point()
 19     Point(double _x, double _y)
 20         x = _x, y = _y;
 21     
 22     void input()
 23         scanf("%lf%lf", &x, &y);
 24     
 25     bool operator == (Point b) const
 26         return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
 27     
 28     bool operator < (Point b)const
 29         return sgn(x - b.x) == 0 ? sgn(y - b.y < 0) : x < b.x;
 30     
 31     Point operator - (const Point &b)const
 32         return Point(x - b.x, y - b.y);
 33     
 34     //²æ»ý
 35     double operator ^(const Point &b)
 36         return x * b.y - y * b.x;
 37     
 38     //µã»ý
 39     double operator *(const Point &b)
 40         return x * b.x + y * b.y;
 41     
 42     double len()
 43         return hypot(x, y);
 44     
 45     double len2()
 46     return x * x + y * y;
 47     
 48     double distant(Point p)
 49         return hypot(x - p.x, y - p.y);
 50     
 51     Point operator + (const Point &b)const
 52         return Point (x + b.x, y + b.y);
 53     
 54     Point operator * (const double &k)const
 55         return Point(x * k, y * k);
 56     
 57     Point operator / (const double &k)const
 58         return Point(x / k, y / k);
 59     
 60     Point rotate(Point p, double angle)
 61         Point v = (*this) - p;
 62         double c = cos(angle), s = sin(angle);
 63         return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
 64     
 65 ;
 66 struct polygon
 67     int n;
 68     Point p[maxp];
 69     void add(Point q)
 70         p[n ++] = q;
 71     
 72     void input(int _n)
 73         n = _n;
 74         for(int i = 0;i < n;i++) p[i].input();
 75     
 76     Point circumcenter(const Point &a,const Point &b,const Point &c) 
 77         //返回三角形的外心
 78         Point ret;
 79         double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1*a1+b1*b1) / 2;
 80         double a2 = c.x - a.x, b2 = c.y - a.y, c2 = (a2*a2 + b2*b2) / 2;
 81         double d = a1 * b2 - a2 * b1;
 82         ret.x = a.x + (c1*b2 - c2*b1) / d;
 83         ret.y = a.y + (a1*c2 - a2*c1) / d;
 84         return ret;
 85     
 86     void min_cover_circle(Point &c,double &r)  // p为点的集合;c为圆心,r为半径
 87         random_shuffle(p,p+n);
 88         c = p[0];
 89         r = 0;
 90         for(int i = 1; i < n; i++) 
 91             if(c.distant(p[i]) > r + eps) 
 92                 c = p[i];
 93                 r = 0;
 94                 for(int j = 0; j < i; j++)
 95                     if(c.distant(p[j]) > r + eps) 
 96                         c.x = (p[i].x + p[j].x) / 2;
 97                         c.y = (p[i].y + p[j].y) / 2;
 98                         r = c.distant(p[j]);
 99                         for(int k = 0; k < j; k++) 
100                             if(c.distant(p[k]) > r + eps) 
101                             c = circumcenter(p[i],p[j],p[k]);
102                             r = c.distant(p[i]);
103                             
104                         
105                     
106                 
107             
108         
109     
110 ;
111 int main()
112 
113     int n;
114     double r;
115     double ans;
116     while(~scanf("%d",&n) &&n)
117     
118         polygon a;
119         Point c;
120         a.input(n);
121         scanf("%lf",&r);
122         a.min_cover_circle(c,ans);
123         if(ans <= r) printf("The polygon can be packed in the circle.\\n");
124         else printf("There is no way of packing that polygon.\\n");
125     
126     return 0;
127 

 

以上是关于UVA 10005 Packing polygons(最小圆覆盖)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 1149 - Bin Packing

UVa 1149 Bin Packing 题解

习题 8-1 UVA - 1149Bin Packing

UVA634 Polygon点与多边形

uva 11971 Polygon

UVA - 11277 Cyclic Polygons(二分)