poj 2007 Scrambled Polygon (凸包 )

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

 

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 }

 

 

你可能感兴趣的:(2007)