卷包裹。
这是一个变形的极角排序。为什么这样排序就是对的呢?
因为我们一开始选的左下的点,那么所有的点都在它的上方。如果有点在它的下方,就会出现循环着>0。
重点在选点的顺序上。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 105 #define inf 0x3f3f3f3f #define eps 1e-7 using namespace std; struct point { double x,y;int id; point (double x,double y):x(x),y(y) {} point () {} }p[maxn]; int n,t,mnx,mny,pos,x; bool vis[maxn]; double rx,ry; double cross(const point &x,const point &y) {return (x.x-rx)*(y.y-ry)-(y.x-rx)*(x.y-ry);} double dist(const point &x) {return (x.x-rx)*(x.x-rx)+(x.y-ry)*(x.y-ry);} bool cmp(const point &x,const point &y) { double rt=cross(x,y); if (fabs(rt)<eps) return dist(x)<dist(y); else return rt>0; } bool cmp1(const point &x,const point &y) {return x.id<y.id;} void work() { memset(vis,false,sizeof(vis)); scanf("%d",&n);mnx=mny=inf; for (int i=1;i<=n;i++) { scanf("%d%lf%lf",&x,&p[i].x,&p[i].y); p[i].id=x; } sort(p+1,p+n+1,cmp1); for (int i=1;i<=n;i++) { if (p[i].y<mny) {mnx=p[i].x;mny=p[i].y;pos=i;} else if ((p[i].y==mny) && (p[i].x<mnx)) {mnx=p[i].x;pos=i;} } printf("%d ",n);rx=p[pos].x;ry=p[pos].y; swap(p[pos],p[1]); for (int i=1;i<=n;i++) { if (i-1) sort(p+i,p+n+1,cmp); if (i<n) printf("%d ",p[i].id); else printf("%d ",p[i].id); rx=p[i].x;ry=p[i].y; } } int main() { scanf("%d",&t); for (int i=1;i<=t;i++) work(); return 0; }