还是最小覆盖圆问题,以前做的时候不会。。。比较最小覆盖圆半径和题目给的半径大小。
我的模板好长好长好长哦。。。T T 。。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int MAX = 110; struct point { double x,y;}; point p[MAX]; const double eps = 1e-6; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y double disp2p(point a,point b) { return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); } point l2l_inst_p(point u1,point u2,point v1,point v2) { point ans = u1; double t = ((u1.x - v1.x)*(v1.y - v2.y) - (u1.y - v1.y)*(v1.x - v2.x))/ ((u1.x - u2.x)*(v1.y - v2.y) - (u1.y - u2.y)*(v1.x - v2.x)); ans.x += (u2.x - u1.x)*t; ans.y += (u2.y - u1.y)*t; return ans; } point circumcenter(point a,point b,point c) { point ua,ub,va,vb; ua.x = ( a.x + b.x )/2; ua.y = ( a.y + b.y )/2; ub.x = ua.x - a.y + b.y;//根据 垂直判断,两线段点积为0 ub.y = ua.y + a.x - b.x; va.x = ( a.x + c.x )/2; va.y = ( a.y + c.y )/2; vb.x = va.x - a.y + c.y; vb.y = va.y + a.x - c.x; return l2l_inst_p(ua,ub,va,vb); } void min_cover_circle(point p[],int n,point &c,double &r) { random_shuffle(p,p+n); c = p[0]; r = 0; int cnt = 0; for(int i=1; i<n; i++) if( dy(disp2p(p[i],c),r) ) { c = p[i]; r = 0; for(int k=0; k<i; k++) if( dy(disp2p(p[k],c),r) ) { c.x = (p[i].x + p[k].x)/2; c.y = (p[i].y + p[k].y)/2; r = disp2p(p[k],c); for(int j=0; j<k; j++) if( dy(disp2p(p[j],c),r) ) { // 求外接圆圆心,三点必不共线 c = circumcenter(p[i],p[k],p[j]); r = disp2p(p[i],c); } } } } int main() { int n; double r,rr; point c; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y); scanf("%lf",&r); min_cover_circle(p,n,c,rr); if( dyd(r,rr) ) printf("The polygon can be packed in the circle.\n"); else printf("There is no way of packing that polygon.\n"); } return 0; }