poj1113Wall(凸包)

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   tar   

連結

順便整理出來一份自己看著比較順眼的模板

  1 #include <iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<algorithm>  5 #include<stdlib.h>  6 #include<vector>  7 #include<cmath>  8 #include<queue>  9 #include<set> 10 using namespace std; 11 #define N 1010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = 3.141592653; 16 const double inf = ~0u>>2; 17 struct Point 18 { 19     double x,y; 20     Point(double x=0,double y=0):x(x),y(y) {} //建構函式 方便代碼編寫 21 }p[N],ch[N]; 22 typedef Point pointt; 23 pointt operator + (Point a,Point b) 24 { 25     return Point(a.x+b.x,a.y+b.y); 26 } 27 pointt operator - (Point a,Point b) 28 { 29     return Point(a.x-b.x,a.y-b.y); 30 } 31 pointt operator * (Point a,double b) 32 { 33     return Point(a.x*b,a.y*b); 34 } 35 pointt operator / (Point a,double b) 36 { 37     return Point(a.x/b,a.y/b); 38 } 39 bool operator < (const Point &a,const Point &b) 40 { 41     return a.x<b.x||(a.x==b.x&&a.y<b.y); 42 } 43 int dcmp(double x) 44 { 45     if(fabs(x)<eps) return 0; 46     else return x<0?-1:1; 47 } 48 bool operator == (const Point &a,const Point &b) 49 { 50     return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0; 51 } 52 //求點積以及利用點積求長度和夾角的函數 53 double dot(Point a,Point b) 54 { 55     return a.x*b.x+a.y*b.y; 56 } 57 //叉積及叉積求面積 58 double cross(Point a,Point b) 59 { 60     return a.x*b.y-a.y*b.x; 61 } 62 double  dis(Point a) 63 { 64     return sqrt(dot(a,a)); 65 } 66 double mul(Point p0,Point p1,Point p2) 67 { 68     return cross(p1-p0,p2-p0); 69 } 70 bool cmp(Point a,Point b) 71 { 72     if(dcmp(mul(p[1],a,b))==0) 73         return dis(a-p[1])<dis(b-p[1]); 74     else 75         return dcmp(mul(p[1],a,b))>0; 76 } 77 int Graham(int n) 78 { 79     int i,k = 1,top = 1; 80     Point tmp; 81     if(n<=3) 82     { 83         for(i = 1; i <= 3 ; i++) 84             ch[i] = p[i]; 85         return n+1; 86     } 87     for(i = 1 ; i <= n; i++) 88     { 89         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x)) 90             k = i; 91     } 92     if(k!=1) 93     { 94         tmp = p[1];  p[1] = p[k];  p[k] = tmp; 95     } 96     sort(p+2,p+n+1,cmp); 97     ch[top++] = p[1]; 98     ch[top++] = p[2]; 99     ch[top++] = p[3];100     for(i = 4; i <= n ;)101     {102         if(top<3||mul(ch[top-2],ch[top-1],p[i])>0)103         {104             ch[top++] = p[i++];105         }106         else  top--;107     }108     return top;109 }110 int main()111 {112     int i,n,r;113     while(scanf("%d%d",&n,&r)!=EOF)114     {115         for(i = 1 ; i <= n ; i++)116         {117             scanf("%lf%lf",&p[i].x,&p[i].y);118         }119         int top = Graham(n);120         ch[top] = p[1];121         double ma;122         ma = 2*pi*r;123         for(i = 1 ; i < top ; i++)124         {125             ma += dis(ch[i]-ch[i+1]);126         }127         printf("%.0f\n",ma);128     }129     return 0;130 }
View Code

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.