poj1696---计算几何

//运用叉积判断是否是逆时针,因为同一直线上也行,所以有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值