poj 1113 凸包模板
2013-03-11 16:57
429 查看
#include <iostream> #include <cstring> #include <cstdio> #include <math.h> #include <cstdlib> #include <algorithm> using namespace std; #define N 1050 #define PI acos(-1.0) int n,r; struct point { int x,y; point(int _x=0,int _y=0) { x=_x; y=_y; } point operator-(point b)const { return point(x-b.x,y-b.y); } }p ,ch ; int cross(point a,point b) { return a.x*b.y-a.y*b.x; } bool cmp(point a,point b) { return a.x==b.x?a.y<b.y:a.x<b.x; } double dist(point a,point b) { return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int convexhull(point *p,int n,point *ch) { sort(p+1,p+1+n,cmp); int m=0; for(int i=1;i<=n;++i) { while(m>1 && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; ch[m++]=p[i]; } int k=m; for(int i=n-1;i>=1;--i) { while(m>k && cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; ch[m++]=p[i]; } if(n>1) m--; return m; } int main () { while(scanf("%d%d",&n,&r)!=EOF) { for(int i=1;i<=n;++i) scanf("%d%d",&p[i].x,&p[i].y); int cnt=convexhull(p,n,ch); double res=0.0; for(int i=0;i<cnt-1;++i) res+=dist(ch[i],ch[i+1]); res+=dist(ch[cnt-1],ch[0]); res+=2*PI*r; printf("%.0lf\n",res); } return 0; }
相关文章推荐
- poj 1113 Wall (凸包模板题)
- POJ 1113 凸包模板题
- POJ 1113 凸包模板题
- 计算几何--求凸包模板--Graham算法--poj 1113
- 计算几何--求凸包模板--Graham算法--poj 1113
- POJ 1113 Wall 凸包(模板题)
- POJ 1113 Wall(凸包)
- POJ 1113 Wall (凸包)
- 计算几何:极角排序(poj 2007 Scrambled Polygon)与简单凸包(poj 1113 Wall)
- 【凸包 Graham法 点集排序】poj 1113 Wall
- Graham 扫描算法求凸包,poj 2187(水题但是是我的第一个求n点集凸包模板)
- 【模板大法好】 凸包模板(以及poj1113题代码)
- poj 1113(凸包)
- poj-1113-Wall(凸包问题)
- 7_6_P题 Wall 题解[poj 1113] (凸包)
- poj 1113 Wall(凸包)
- POJ 1113(凸包入门题)
- POJ 1113 || HDU 1348: wall(凸包问题)
- Poj 2187 凸包模板求解
- POJ_1113_Wall_凸包