HDU1392+凸包

來源:互聯網
上載者:User
/* 幾何 凸包 順時針!!! */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> //#include<map> #include<math.h> using namespace std; typedef long long ll; //typedef __int64 int64; const int maxn = 105; const int inf = 0x7fffffff; const int pi=acos(-1.0); struct node{     int x,y;     bool operator <( const node &a ) const {         return y<a.y||(y==a.y&&x<a.x);     } }; node pnt[ maxn ],res[ maxn ];  int cross( node sp,node ep,node op ){     return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y); } /* ep | | op----sp ( from sp to ep ) */  double dis( node a,node b ){     double sum=0;     sum=1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y);     return sqrt( sum ); }//兩點之間的距離  int graham( int n ){     int top=1;     sort( pnt,pnt+n );     if( n==0 ) return 0;     else res[ 0 ]=pnt[ 0 ];     if( n==1 ) return 1;     else res[ 1 ]=pnt[ 1 ];     if( n==2 ) return 2;     else res[ 2 ]=pnt[ 2 ];          for( int i=2;i<n;i++ ){         while( top&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 )             top--;             res[ ++top ]=pnt[ i ];     }          int len=top;     res[ ++top ]=pnt[ n-2 ];     for( int i=n-3;i>=0;i-- ){         while( top!=len&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 )             top--;         res[ ++top ]=pnt[ i ];     }          return top;//返回res中的點的個數 }      int main(){     int n;     while( scanf("%d",&n)==1,n ){         for( int i=0;i<n;i++ )             scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y);         if( n==1 )         {             printf("0.00\n");             continue;         }         if( n==2 )         {             printf("%.2lf\n",dis( pnt[0],pnt[1] ) );             continue;         }//注意這兩個情況的討論!!!         int cnt=graham( n );         double ans=0;         for( int i=0;i<cnt;i++ ){             if( i==cnt-1 ){                 ans+=( dis( res[ cnt-1 ],res[ 0 ] ) );             }             else{                 ans+=( dis( res[ i ],res[ i+1 ] ) );             }         }         printf("%.2lf\n",ans);     }     return 0; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.