`
xxx0624
  • 浏览: 28736 次
文章分类
社区版块
存档分类
最新评论

HDU1392+凸包

 
阅读更多
/*
 几何 凸包
 顺时针!!!
 */
 #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;
 }


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics