POJ 1113 WALL(凸包-计算几何)
2010-08-14 18:51
441 查看
题目大意:给出城堡的若干点,要求在其周围建围墙,使距离城堡>=L,并使长度最短。
思路:
求出若干点的凸包,每个边平行向外延伸L,断开处用圆弧连接,圆弧的端点连接原凸包顶点,则分别与两边垂直,则圆心角与内夹角互补。
设凸包为n边形,则凸包内角和为(n-2)*PI ,则凸包外所有圆心角和为n*PI-(n-2)*PI=2*PI,刚好为一半径为L的圆周长。
求凸包时 按y从小到大排 y相同按x从小到大排。
思路:
求出若干点的凸包,每个边平行向外延伸L,断开处用圆弧连接,圆弧的端点连接原凸包顶点,则分别与两边垂直,则圆心角与内夹角互补。
设凸包为n边形,则凸包内角和为(n-2)*PI ,则凸包外所有圆心角和为n*PI-(n-2)*PI=2*PI,刚好为一半径为L的圆周长。
求凸包时 按y从小到大排 y相同按x从小到大排。
#include <iostream> #include <cmath> using namespace std; const double PI=3.1415926536; struct Point { int x,y; }; Point P[1001],C[1001]; //求叉积 int cross(Point p1,Point p2,Point p3) { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } double dis(Point p1,Point p2) { return sqrt(double(((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)))); } int cmp(const void *a ,const void *b) { Point *c=(Point *)a; Point *d=(Point *)b; if(c->y == d->y) return c->x-d->x; else return c->y-d->y; } int main() { int L,N,i,m,m1; double ans; while(scanf("%d%d",&N,&L)!=EOF) { for(i=0;i<N;i++) scanf("%d%d",&P[i].x,&P[i].y); qsort(P,N,sizeof(P[0]),cmp); //左链 for(m=0,i=0;i<N;i++) { while(m>1 && cross(C[m-1],C[m-2],P[i])<=0) m--; C[m++]=P[i]; } m1=m; //右链 for(i=N-2;i>=0;i--) { while(m>m1 && cross(C[m-1],C[m-2],P[i])<=0) m--; C[m++]=P[i]; } for(ans=0,i=0;i<m-1;i++) ans+=dis(C[i],C[i+1]); ans+=2*PI*L; printf("%.0lf/n",ans); } return 0; }
相关文章推荐
- poj1113——Wall(计算几何凸包)
- POJ1113(Wall) && Hdu1392(Surround the Trees) (计算几何--凸包)
- POJ 1113 Wall (计算几何-凸包)
- POJ 1113 Wall (计算几何-凸包)
- POJ - 1113 Wall(计算几何凸包)
- POJ1113---Wall(基础计算几何:凸包入门)
- 【计算几何】【求凸包】【POJ 1113】wall
- POJ 1113 Wall(计算几何--凸包的周长)
- poj 1113 Wall 计算几何 凸包 Graham扫描
- 计算几何:极角排序(poj 2007 Scrambled Polygon)与简单凸包(poj 1113 Wall)
- poj 1113:Wall(计算几何,求凸包周长)
- POJ-1113 Wall 计算几何 求凸包
- POJ训练计划1113_Wall(几何/凸包)
- poj 1113 凸包+简单几何计算
- POJ 1113(计算几何初步——凸包加圆周长)
- 计算几何初步之凸包(POJ 1113、2007、1873、1228、3348)
- [Poj 1113] 计算几何之凸包(一) {卷包裹算法}
- [计算几何-凸包]pku1113-Wall
- 简单几何(凸包) POJ 1113 Wall
- 计算几何--求凸包模板--Graham算法--poj 1113