POJ 1696 Space Ant

卷包裹。

这是一个变形的极角排序。为什么这样排序就是对的呢?

因为我们一开始选的左下的点,那么所有的点都在它的上方。如果有点在它的下方,就会出现循环着>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;    
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/6279073.html