zoukankan      html  css  js  c++  java
  • poj 2007 Scrambled Polygon (凸包 )

    题意:
    给出若干个点,求出它们的凸包,并且按原点为第一点的逆时针方向输出。
    输出为:

    (0,0)
    (-30,-40)
    (-30,-50)
    (-10,-60)
    (50,-60)
    (70,-50)
    (90,-20)
    (90,10)
    (80,20)
    (60,30)


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<set>
     7 #include<map>
     8 #include<queue>
     9 #include<vector>
    10 #include<string>
    11 #define Min(a,b) a<b?a:b
    12 #define Max(a,b) a>b?a:b
    13 #define CL(a,num) memset(a,num,sizeof(a));
    14 #define maxn  60
    15 #define eps  1e-12
    16 #define inf 100000000
    17 #define mx 1<<60
    18 #define ll   __int64
    19 using namespace std;
    20 struct point
    21 {
    22     double x,y;
    23 }p[maxn];
    24 int res[maxn];
    25 int dblcmp(double x)
    26 {
    27     if(fabs(x) < eps) return 0;
    28     if(x < 0return -1;
    29     else return 1;
    30 }
    31 double det(double x1,double y1,double x2,double y2)
    32 {
    33     return x1*y2 - x2*y1 ;
    34 }
    35 double cross(point a, point b, point c)
    36 {
    37     return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
    38 }
    39 int cmp(point a,point b)
    40 {
    41     if(a.y != b.y) return a.y < b.y;
    42     else return a.x < b.x;
    43 }
    44 int  top ,n;
    45 void graham()
    46 {
    47     int  i,len;
    48     top = 0;
    49     sort(p,p+n,cmp);
    50     
    51     if(n == 0return ;res[top++] = 0;
    52     if(n == 1return ;res[top++] = 1;
    53    
    54     for(i = 2 ;i<n;i++)//求右链
    55     {
    56         while(top&&dblcmp(cross(p[res[top - 1]],p[res[top - 2]],p[i])) > 0) top--;
    57 
    58         res[top++] = i;
    59     }
    60      
    61     len =  top ;
    62     
    63     for(i = n - 2;i >= 0;i--)//求左链
    64     {
    65          while(top != len && dblcmp(cross(p[res[top - 1]],p[res[top - 2]],p[i])) > 0)top--;
    66          res[top++] = i;
    67 
    68     }
    69     top--;//第一个点 入栈两次 所以 减 1;
    70 
    71 }
    72 int main()
    73 {
    74 
    75       n = 0;
    76       int  i,s;
    77     //freopen("data.txt","r",stdin);
    78     while(scanf("%lf%lf",&p[n].x,&p[n].y)!=EOF)n++;
    79     graham() ;
    80 
    81     for(s = 0 ; s < top;s++)
    82     {
    83         if(p[res[s]].x == 0&&p[res[s]].y == 0) {break;}
    84     }
    85     for( i = s ; i < top; i++)
    86     {
    87         printf("(%.0lf,%.0lf)\n",p[res[i]].x,p[res[i]].y);
    88     }
    89     for(i =0 ;  i< s;i++)
    90     {
    91          printf("(%.0lf,%.0lf)\n",p[res[i]].x,p[res[i]].y);
    92     }
    93 
    94 }

     

  • 相关阅读:
    PAT-乙级-1008 数组元素循环右移问题
    PAT-乙级-1007 素数对猜想
    PAT-乙级-1006 换个格式输出整数
    PAT-乙级-1005 继续(3n+1)猜想
    PAT-乙级-1003 我要通过!
    PAT-乙级-1004 成绩排名
    PAT-乙级-1002 写出这个数
    PAT-乙级-1001 害死人不偿命的(3n+1)猜想
    PAT-甲级-1002-A+B for Polynomials
    【windows】共享文件夹设置
  • 原文地址:https://www.cnblogs.com/acSzz/p/2659737.html
Copyright © 2011-2022 走看看