hdu 1392 Surround the Trees 凸包模板

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392

在判断左旋和右旋时 ,有多种方法, 其实质都是一样的

View Code
  1 /*#include <iostream>
2 #include <cmath>
3 #include <cstring>
4 #include <cstdio>
5 #include <algorithm>
6 using namespace std;
7 struct ss {
8 double x,y;
9 }point[110],stack[110];
10 int n,top;
11 double dis(ss p1,ss p2)//求两点之间的距离
12 {
13 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
14 }
15 double jude(ss p1,ss p2,ss p3) //大于0说明p2在p3的顺时针方向 小于0说明p2在p3的逆时针方向上
16 {
17 return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
18 }
19 int cmp(ss p1,ss p2) //判极角的大小
20 {
21 double t=jude(point[1],p1,p2);
22 if(t==0)
23 return dis(p1,point[1])<dis(p2,point[1]);
24 else if (t>0) return 1;
25 else return 0;
26 }
27 void Convex()
28 {
29 int i;
30 ss temp;
31 for (i=2;i<=n;i++)
32 if(point[i].y<point[1].y||((point[i].y==point[1].y)&&point[i].x<point[1].x))
33 {
34 temp=point[i];
35 point[i]=point[1];
36 point[1]=temp;
37 }
38 sort(point+2,point+n+1,cmp);
39
40 stack[1]=point[1];
41 stack[2]=point[2];
42 top=2;
43
44 for (i=3;i<=n;i++)
45 {
46 while (top>=2&&jude(stack[top-1],stack[top],point[i])<=0.0)
47 {
48 top--;
49 }
50 stack[++top]=point[i];
51 }
52 }
53 int main()
54 {
55 int i;
56 double ans;
57 while (scanf("%d",&n)&&n)
58 {
59 for (i=1;i<=n;i++)
60 {
61 scanf("%lf%lf",&point[i].x,&point[i].y);
62 }
63 if(n==1)printf("0.00\n");
64 else if(n==2)printf("%0.2lf\n",dis(point[1],point[2]));
65 else {
66 ans=0.0;
67 Convex();
68 for (i=1;i<top;i++)
69 {
70 ans+=dis(stack[i],stack[i+1]);
71 }
72 ans+=dis(stack[top],stack[1]);
73 printf("%0.2lf\n",ans);
74 }
75 }
76 return 0;
77 }*/
78
79
80 #include <iostream>
81 #include <cmath>
82 #include <cstring>
83 #include <cstdio>
84 #include <algorithm>
85 using namespace std;
86 struct ss {
87 double x,y;
88 }point[110],stack[110];
89 int n,top;
90 double dis(ss p1,ss p2)//求两点之间的距离
91 {
92 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
93 }
94
95 double jude(ss p1,ss p2,ss p0)//大于0说明p1在p2的顺时针方向 小于0说明p1在p2的逆时针方向上
96 {
97 return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
98 }
99 int cmp(ss p1,ss p2) //判极角的大小
100 {
101 double t=jude(p1,p2,point[1]);
102 if(t==0)
103 return dis(p1,point[1])<dis(p2,point[1]);
104 else if (t>0) return 1;
105 else return 0;
106 }
107
108 void Convex()
109 {
110 int i;
111 ss temp;
112 for (i=2;i<=n;i++)
113 if(point[i].y<point[1].y||((point[i].y==point[1].y)&&point[i].x<point[1].x))
114 {
115 temp=point[i];
116 point[i]=point[1];
117 point[1]=temp;
118 }
119 sort(point+2,point+n+1,cmp);
120
121 stack[1]=point[1];
122 stack[2]=point[2];
123 top=2;
124 for (i=3;i<=n;i++)
125 {
126 while (top>=2&&jude(point[i],stack[top],stack[top-1])>=0.0)
127 {
128 top--;
129 }
130 stack[++top]=point[i];
131 }
132 }
133 int main()
134 {
135 int i;
136 double ans;
137 while (scanf("%d",&n)&&n)
138 {
139 for (i=1;i<=n;i++)
140 {
141 scanf("%lf%lf",&point[i].x,&point[i].y);
142 }
143 if(n==1)printf("0.00\n");
144 else if(n==2)printf("%0.2lf\n",dis(point[1],point[2]));
145 else {
146 ans=0.0;
147 Convex();
148 for (i=1;i<top;i++)
149 {
150 ans+=dis(stack[i],stack[i+1]);
151 }
152 ans+=dis(stack[top],stack[1]);
153 printf("%0.2lf\n",ans);
154 }
155 }
156 return 0;
157 }



posted @ 2012-03-23 16:28  我们一直在努力  阅读(168)  评论(0编辑  收藏  举报