POJ 2007 叉积排序

题意:

给出凸包上的点,其中一个点是(0,0),要求从(0,0)按照逆时针输出所有点。

 

题解:

不能有极角排序,因为多边形可能在原点的左侧。

 

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cmath>
 7 
 8 #define N 2222222
 9 #define EPS 1e-3 
10 //不能直接极角排序,因为图形可能全部在原点左侧 
11 using namespace std;
12 
13 struct PO
14 {
15     double x,y,angle;
16 }p[N];
17 
18 int n=1;
19 
20 inline double cross(PO &a,PO &b,PO &c)
21 {
22     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
23 }
24 
25 inline int doublecmp(double x)
26 {
27     if(x>EPS) return 1;
28     else if(x<-EPS) return -1;
29     return 0;
30 }
31 
32 inline bool cmp(PO a,PO b)
33 {
34     return doublecmp(cross(p[1],a,b))>=0;
35 }
36 
37 inline void go()
38 {
39     for(int i=2;i<=n;i++)
40         if(doublecmp(p[i].x)==0&&doublecmp(p[i].y)==0)
41         {
42             swap(p[i].x,p[1].x); swap(p[i].y,p[1].y);
43             break;
44         }
45     sort(p+2,p+1+n,cmp);
46     for(int i=1;i<=n;i++) printf("(%.0lf,%.0lf)\n",p[i].x,p[i].y);
47 }
48 
49 int main()
50 {
51     while(scanf("%lf%lf",&p[n].x,&p[n].y)!=EOF) n++;
52     n--; go();
53     return 0;
54 }

 

 

posted @ 2013-02-24 20:13  proverbs  阅读(254)  评论(2编辑  收藏  举报