POJ 1113 Wall 凸包求边长 Graham扫描法
2017-02-12 12:52
609 查看
http://www.cnblogs.com/kuangbin/archive/2012/04/13/2445633.html #include<iostream> #include<iomanip> #include<queue> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const double eps=1e-8; struct Vector { int x,y; Vector() {}; Vector(double _x,double _y):x(_x),y(_y) {}; Vector operator+(const Vector& b) const { return Vector(x+b.x,y+b.y); } Vector operator-(const Vector& b) const { return Vector(x-b.x,y-b.y); } Vector operator*(double q) const { return Vector(x*q,y*q); } }; typedef Vector Point; inline double DotProduct(const Vector& a,const Vector& b) { return a.x*b.x+a.y*b.y; } inline int CrossProduct(const Vector& a,const Vector& b) { return a.x*b.y-a.y*b.x; } inline double CrossProduct(const Point& p0,const Point& p1,const Point& p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } inline double Dist(Point a,Point b) { return sqrt(DotProduct(b-a,b-a)); } const int MAX=1000; const double PI=acos(-1.0); Point Ps[MAX]; int Stack[MAX],Top; bool PolarCmp(Point p1,Point p2) { int temp=CrossProduct(Ps[0],p1,p2); if (temp>0) return true; else if (temp==0&&Dist(Ps[0],p1)<Dist(Ps[0],p2)) return true; else return false; } void Init(int n) //将最左下方的点放入Ps[0],并进行极角排序. { Point p0; cin>>Ps[0].x>>Ps[0].y; p0.x=Ps[0].x,p0.y=Ps[0].y; int k=0; for (int i=1;i<n;i++) { cin>>Ps[i].x>>Ps[i].y; if ((p0.y>Ps[i].y)||((p0.y==Ps[i].y)&&(p0.x>Ps[i].x))) { p0.x=Ps[i].x; p0.y=Ps[i].y; k=i; } } Ps[k]=Ps[0]; Ps[0]=p0; sort(Ps+1,Ps+n,PolarCmp); } void Graham(int n) { if (n==1) { Top=0; Stack[0]=0; } if (n==2) { Top=1; Stack[0]=0; Stack[1]=1; } if (n>2) { Top=1; Stack[0]=0; Stack[1]=1; for (int i=2;i<n;i++) { while (Top>0&&CrossProduct(Ps[Stack[Top-1]],Ps[Stack[Top]],Ps[i])<=0) Top--; Top++; Stack[Top]=i; } } } int main() { int N,L; cin.sync_with_stdio(false); cout<<fixed<<setprecision(0); while (cin>>N>>L) { Init(N); Graham(N); double Ans=0; for (int i=0;i<Top;i++) Ans+=Dist(Ps[Stack[i]],Ps[Stack[i+1]]); Ans+=Dist(Ps[Stack[0]],Ps[Stack[Top]]); Ans+=2*PI*L; cout<<Ans<<endl; } return 0; }
相关文章推荐
- poj 1113 Wall(Graham扫描法求凸包)
- poj 1113 Wall 计算几何 凸包 Graham扫描
- POJ 1113 Wall(Graham求凸包周长)
- 【凸包 Graham法 点集排序】poj 1113 Wall
- Poj 1113 Wall (凸包Graham)
- POJ 1113-Wall(凸包-Graham算法)
- Poj 1113 Wall (凸包Graham水平序)
- poj 1113 Wall 凸包
- poj 1113 Wall----凸包 (给自己的一句话: 没AC,没理由!)
- Graham 扫描算法求凸包,poj 2187(水题但是是我的第一个求n点集凸包模板)
- 【poj 2187】Beauty Contest(凸包,graham扫描法,旋转卡壳法)
- POJ 1113 凸包2 Graham-scan 入门题(极角序,水平序)
- 计算几何--求凸包模板--Graham算法--poj 1113
- poj 1113 Wall (凸包)
- poj1113 Wall 凸包问题 官方数据
- 7_6_P题 Wall 题解[poj 1113] (凸包)
- poj1113——Wall(计算几何凸包)
- POJ1113 wall 简单凸包
- POJ 1113 Wall 凸包面积 poj 2187 Beauty Contest
- 计算几何--求凸包模板--Graham算法--poj 1113