POJ 1696 Space Ant G++ 看书学叉积 极角排序 巧妙 背

#include <iostream>
#include <cstdio>
#include <cmath> 
#include <algorithm>
using namespace std;
//英语      看博友分析     抄博友程序      看书学叉积     极角排序       巧妙      背 
//叉积     在这里θ表示两向量之间的夹角
struct nod{
	double x;
	double y;
	int index;
	nod operator -(const nod b)const
	{
		return (nod){x-b.x, y-b.y, 0};
	} 
	//叉积 
	double operator ^ (const nod b)const//抄博友程序 背   博友有类外定义的 
	{
		return x*b.y-y*b.x;
	} 
	//点积
	double operator * (const nod b)const
	{
		return x*b.x+y*b.y;//背    知识 
	} 
};
int sgn(double x)//抄博友程序 
{
	if(fabs(x)<1e-8)//包含0 
	{
		return 0;
	}else if(x<0)
	{
		return -1;
	}else
	{
		return 1;
	}
} 
//两点间距离
double dist(nod a,nod b)
{
	return sqrt((a-b)*(a-b));//抄博友程序     背 
}
int pos;
nod p[100];
bool cmp(nod a,nod b)
{
	double tmp=(a-p[pos])^(b-p[pos]);//巧妙 
	int t=sgn(tmp);
	if(t==0)
	{
		return dist(a,p[pos])<dist(b,p[pos]);//重要 
	}else if(t==-1)
	{
		return false;
	}else
	{
		return true;
	} 
} 
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		for(int i=0;i<n;i++)
		{
			cin>>p[i].index>>p[i].x>>p[i].y;
			if(p[i].y<p[0].y || (p[i].y==p[0].y && p[i].x<p[0].x))//背 
			{
				swap(p[i],p[0]);
			}
		}
		pos=0;
		for(int i=1;i<n;i++)
		{
			sort(p+i,p+n,cmp);//重要  巧妙 
			pos++;
		}
		cout<<n;
		for(int i=0;i<n;i++)
		{
			cout<<" "<<p[i].index;
		}
		cout<<endl; 
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值