现在的位置: 首页 > 综合 > 正文

poj 1696 Space Ant–有关极角

2013年08月14日 ⁄ 综合 ⁄ 共 1050字 ⁄ 字号 评论关闭
/*
题意:从最低的点开始,不能向右拐,问能经过多少点?
能定是经过所有点了   

从最低点开始,求与其极角最小的点,作为新的起点,在需找与这个点成极角最小的点,依次即可
*/
#include<stdio.h>
#include<stdlib.h>
struct point 
{
	int x,y,n;
}dian[60];
int n;
int dis(point a,point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}
int cross(point p,point s,point e)
{
	return (e.x-s.x)*(p.y-s.y)-(p.x-s.x)*(e.y-s.y);
}
int cmp(const void *a,const void *b,int zhu)
{
	int ret;
	point *c=(point*)a,*d=(point*)b;
	ret=cross(*d,dian[zhu],*c);
	if(ret!=0) return -ret;
	else if(dis(*c,dian[zhu])>dis(*d,dian[zhu]))
		return 1;
	else return 0;
}
int pro(int  i)
{
	int bao=i;
	int a=i;
	for(i=i+1;i<=n;++i)
	{
		if(cmp(&dian[a],&dian[i],bao-1)>0)
			a=i;
	}
	return a;
}
int main()
{
	int t,i,l,a;
	scanf("%d",&t);
	while(t--)
	{
		l=-1;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d%d%d",&a,&dian[i].x,&dian[i].y);
			dian[i].n=i;
			if(l==-1||(dian[i].y<dian[l].y)||((dian[l].x>dian[i].x)&&(dian[l].y==dian[i].y)))
				l=i;
		}
		dian[n+1]=dian[l];
		dian[l]=dian[1];
		dian[1]=dian[n+1];
		dian[0].x=0,dian[0].y=dian[1].y;
		for(i=2;i<n;i++)
		{
			a=pro(i);
			dian[n+1]=dian[i];
			dian[i]=dian[a];
			dian[a]=dian[n+1];
		}
		printf("%d",n);
		for(i=1;i<=n;++i)
			printf(" %d",dian[i].n);
		printf("\n");
	}
	return 0;
}

抱歉!评论已关闭.