POJ1696 Space Ant 【凸包-ToLeft-Test】

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
struct node
{
    int x,y;
    int id;
} p[100];
int n,acnt,cnt,ans[100],t[100],u[100];
int d[55][55][55][55];
int cmp(node a,node b)
{
    if(a.y==b.y) return a.x<b.x;
    else return a.y<b.y;
}

int cross(const node &a, const node &b, const node &p)
{
    return (b.x - a.x)*(p.y - a.y) - (b.y - a.y)*(p.x - a.x);
}

bool toLeft(const node &a, const node &b, const node &p)
{
    return cross(a, b, p) > 0;
}

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d%d",&p[i].id,&p[i].x,&p[i].y);
        }
        sort(p+1,p+n+1,cmp);
        p[0].x=0;
        p[0].y=p[1].y;
memset(u,0,sizeof(u));
        u[0]=1;
        u[1]=1;

        ans[0]=0;
        ans[1]=1;
        int k=2;
        while(k<=n)
        {
            for(int i=2; i<=n; i++)
            {
                if(u[i]==1) continue;
                int ok=1;
                ans[k]=i;
                if(toLeft(p[ans[k-2]],p[ans[k-1]],p[i])==0) continue;
                for(int j=2;j<=n;j++)
                {
                    if(u[j]==1||i==j) continue;
                    if(toLeft(p[ans[k-1]],p[ans[k]],p[j])==0)
                    {
                        ok=0;
                        break;
                    }
                }
                if(ok==0) continue;
                //printf("%d\n",p[i].id);
                k++;
                u[i]=1;
                break;
            }
        }

        printf("%d",k-1);
        for(int i=1; i<k; i++)
        {
            printf(" %d",p[ans[i]].id);
        }
        puts("");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章