Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2876 | Accepted: 1839 |
Description
Input
Output
Sample Input
2 10 1 4 5 2 9 8 3 5 9 4 1 7 5 3 2 6 6 3 7 10 10 8 8 1 9 2 4 10 7 6 14 1 6 11 2 11 9 3 8 7 4 12 8 5 9 20 6 3 2 7 1 6 8 2 13 9 15 1 10 14 17 11 13 19 12 5 18 13 7 3 14 10 16
Sample Output
10 8 7 3 4 9 5 6 2 1 10 14 9 10 11 5 12 8 7 6 13 4 14 1 3 2
Source
1 #include <iostream>
2 using namespace std; 3 #define eps 1e-10
4 struct Point{ //定义点
5 double x,y; 6 Point(double x=0,double y=0):x(x),y(y) {} 7 }; 8 typedef Point Vector; //重定义向量
9 Vector operator + (Vector a,Vector b) //向量+向量
10 { 11 return Vector(a.x+b.x,a.y+b.y); 12 } 13 Vector operator - (Point a,Point b) //点-点 = 向量
14 { 15 return Vector(a.x-b.x,a.y-b.y); 16 } 17 double Cross(Vector a,Vector b) //求叉积
18 { 19 return a.x*b.y-b.x*a.y; 20 } 21 int main() 22 { 23 int T; 24 cin>>T; 25 while(T--){ 26 int n,i; 27 Point p[55]; 28 bool isw[55] = {0}; //记录走没走过
29 cin>>n; 30 for(i=1;i<=n;i++){ //输入点集
31 int t; 32 cin>>t; 33 cin>>p[t].x>>p[t].y; 34 } 35 //找出y坐标最小的那个点
36 double yMin=p[1].y; 37 int num = 1; 38 for(i=2;i<=n;i++){ 39 if(p[i].y < yMin){ 40 yMin = p[i].y; 41 num = i; 42 } 43 } 44 //构成凸包
45 int pl[55]; //存储结果
46 int j; 47 pl[1] = num; 48 isw[pl[1]] = true; 49 for(i=1;i<n;i++){ 50 for(j=1;j<=n;j++) //选择一个没走过的点
51 if(!isw[j]) 52 break; 53 pl[i+1] = j; 54 for(j=1;j<=n;j++){ //选择最右边的点
55 if(pl[i+1]==j || isw[j]) 56 continue; 57 if(Cross(p[j] - p[pl[i]],p[pl[i+1]] - p[pl[i]])>0) 58 pl[i+1] = j; 59 } 60 isw[pl[i+1]] = true; 61 } 62 cout<<n<<' '; 63 for(i=1;i<=n;i++) 64 cout<<pl[i]<<' '; 65 cout<<endl; 66 } 67 return 0; 68 }
Freecode : www.cnblogs.com/yym2013