ACM PKU 1696 Space Ant

题目描述:http://poj.org/problem?id=1696

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

const int MAXN=50;

using namespace std;

struct point
{
    int x,y,index;
} p[MAXN+10];

point tmp;

int test;

int Xmul(point sp, point ep, point op)
{
    return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y);
}

int len (const point & a,const point &b)
{
    return (b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y);
}

bool cmp (const point & a,const point &b)    //这个比较函数很高明啊!
{
    if(Xmul(a,b,tmp)>0)
    {
        return true;
    }
    if(Xmul(a,b,tmp)==0)
    {
        if(len(a,tmp)<len(b,tmp))return true;
    }
    return false;
}

int main()
{
    freopen("in.txt","r",stdin);
    int n_case;
    scanf("%d",&n_case);
    while(n_case--)
    {
        scanf("%d",&test);
        for(int i=0; i<test; i++)
        {
            scanf("%d%d%d",&p[i].index,&p[i].x,&p[i].y);
        }
        tmp=p[0];
        int idx=0;
        for(int i=1; i<test; i++)
        {
            if (p[i].y < tmp.y || (p[i].y == tmp.y && p[i].x < tmp.x))
            {
                tmp=p[i];
                idx=i;
            }
        }
        if(idx!=0) swap(p[0],p[idx]);


        for(int i=1; i<test; i++)
        {
            tmp=p[i-1];
            sort(p+i,p+test,cmp);    //这里刚开始写错了,悲剧了,之前一直理解错误了,还是思维不完善;
        }
        printf("%d",test);
        for(int i=0; i<test; i++)
        {
            printf(" %d",p[i].index);
        }
        printf("\n");
    }
    return 0;
}

  

posted on 2011-08-22 16:47  _Clarence  阅读(143)  评论(0编辑  收藏  举报

导航