#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;
}
POJ1696 Space Ant 【凸包-ToLeft-Test】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.