//运用叉积判断是否是逆时针,因为同一直线上也行,所以有n个植物就可以吃掉n个植物
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#define dist(a,b) sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y))
#define cross(a,b,c) 1.0*(b.x-a.x)*(c.y-a.y)-1.0*(b.y-a.y)*(c.x-a.x)
#define dot(a,b,c) (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y)
#define delt(a) fabs(a)<eps?0:a>0?1:-1
#define pi acos(-1.0)
#define eps 1e-8
#define inf 1e20
#define N 105
#define M 1005
using namespace std;
typedef __int64 i64;
struct TPoint
{
int x,y,id;
}pt[N];
int n,m,t;
int path[N];
bool vis[N];
void scan()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d",&pt[i].id,&pt[i].x,&pt[i].y);
memset(vis,0,sizeof(vis));
}
bool cmp(TPoint a,TPoint b)
{
return a.y<b.y||(a.y==b.y&&a.x<b.x);
}
void output()
{
int i,j,k;
printf("%d",m);
for(i=0;i<m;i++) printf(" %d",path[i]);
puts("");
}
void solve()
{
sort(pt,pt+n,cmp);
TPoint p1,p2;
p1=pt[0],m=0;
path[m++]=pt[0].id;
vis[pt[0].id]=1;
int i,j,k;
while(1)
{
double minl=inf,l;
for(i=0,j=-1;i<n;i++)
{
if(vis[pt[i].id]) continue;
j=i; break;
}
if(j==-1) break;
p2=pt[j];
minl=dist(p1,p2);
for(i=0,j=-1;i<n;i++)
{
if(vis[pt[i].id]) continue;
int d1=delt(cross(p1,p2,pt[i]));
l=dist(pt[i],p1);
if(d1<0||(d1==0&&l<minl))
{
p2=pt[i]; minl=l; j=i;
}
}
path[m++]=p2.id;
p1=p2;
vis[p2.id]=1;
}
output();
}
int main()
{
scanf("%d",&t);
while(t--)
{
scan();
solve();
}
return 0;
}
poj1696---计算几何
最新推荐文章于 2022-04-08 10:57:44 发布