题意 : 一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法,能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉.
思路 : 每次找的时候排一下序然后输出最外边的点就行了。
极角排序是根据坐标系内每一个点与x轴所成的角,逆时针比较,。按照角度从小到大的方式排序。
其实我觉得就是用atan2排序 。。。。。

1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <math.h> 5 #include <algorithm> 6 7 using namespace std ; 8 9 struct point 10 { 11 int x,y ; 12 int ID ; 13 }p[100]; 14 point pp ; 15 16 bool cmp(point a,point b) 17 { 18 return a.y < b.y ; 19 } 20 double cross(point a,point b,point c) 21 { 22 return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y) ; 23 } 24 25 double dis(point a,point b) 26 { 27 return sqrt(double((b.x-a.x)*(b.x-a.x)+ (b.y-a.y)*(b.y-a.y))) ; 28 } 29 bool cmp1(point a,point b) 30 { 31 int cr = cross(a,b,pp) ;//判断顺时针还是逆时针 32 if(cr > 0) return true ; 33 else if(cr < 0) return false ; 34 else//共线 35 { 36 if(dis(a,pp) < dis(b,pp)) return true ; 37 else return false ; 38 } 39 } 40 int main() 41 { 42 int T ,n; 43 scanf("%d",&T) ; 44 while(T--) 45 { 46 scanf("%d",&n) ; 47 for(int i = 0 ; i < n ; i++) 48 { 49 scanf("%d %d %d",&p[i].ID,&p[i].x,&p[i].y) ; 50 } 51 sort(p,p+n,cmp) ; 52 pp = p[0] ; 53 printf("%d",n) ; 54 printf(" %d",pp.ID) ; 55 for(int i = 1 ; i < n ; i++) 56 { 57 sort(p+i,p+n,cmp1) ; 58 pp = p[i] ; 59 printf(" %d",pp.ID) ; 60 } 61 printf(" ") ; 62 } 63 return 0 ; 64 }