对各个点进行极角排序,然后输出,搞定! #include<stdio.h> #include<math.h> #include<string.h> #define max 55 struct node { int x,y; }min,g[max],stack[max]; int top,n; int pan(node yuan,node zhong,node last) { return (yuan.x-zhong.x)*(last.y-zhong.y)-(last.x-zhong.x)*(yuan.y-zhong.y); } int dis(node a,node b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } void sort() { int i,j,k=0; min=g[0]; for(i=1;i<n;i++) { if(g[i].y<min.y||(g[i].y==min.y&&g[i].x<min.x)) { min=g[i]; k=i; } } min=g[k];g[k]=g[0];g[0]=min; for(i=1;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(pan(g[0],g[k],g[j])>0||(pan(g[0],g[k],g[j])==0&&dis(g[0],g[k])>dis(g[0],g[j]))) k=j; } min=g[i]; g[i]=g[k]; g[k]=min; } for(i=0;i<n;i++) { if(g[i].x==0&&g[i].y==0) k=i; } for(i=k;i<n;i++) printf("(%d,%d)/n",g[i].x,g[i].y); for(i=0;i<k;i++) printf("(%d,%d)/n",g[i].x,g[i].y); } int main() { int i=0,j; int a,b; while(scanf("%d%d",&a,&b)!=EOF) { g[i].x=a; g[i].y=b; i++; } n=i; sort(); return 0; }