poj 1696 极角排序(解题报告)
2024-10-06 00:52:02
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
double eps=1e-8;
int sgn(double x)
{
if(fabs(x)<=eps)return 0;
if(x<0)return -1;
return 1;
}
struct Point
{
double x,y;
int index;
Point (){}
Point(double _x,double _y)
{
x=_x;
y=_y;
}
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
double operator *(const Point &b)const
{
return x*b.x+y*b.y;
}
double operator ^(const Point &b)const
{
return x*b.y-y*b.x;
}
}; double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
int pos;
Point p[100];
bool cmp(Point a,Point b)
{
double tmp=sgn((a-p[pos])^(b-p[pos]));
if(tmp==0)return dist(a,p[pos])<dist(b,p[pos]);
if(tmp<0)return false;
return true; } int main ()
{
int T;
cin>>T;
int n;
while(T--)
{
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[0],p[i]);
}
pos=0;
for(int i=1;i<n;i++)
{
sort(p+i,p+n,cmp);//这里是i,排序i后的点
pos++;
}
cout<<n;
for(int i=0;i<n;i++)
cout<<' '<<p[i].index;
cout<<endl;
} return 0; }
题意:有一个蚂蚁。在一个平面上吃植物,这个蚂蚁只能往左走,求蚂蚁最多能吃到多少植物,并将路线输出
转化:最多能将所有的植物都吃完。只要绕最外边一圈逆时针往前走,一直走到最里边的 一个植物即可
通过极角排序,先按照左下角植物排序,绕逆时针依次为极点进行排序,排到最后一个点输出即可
最新文章
- 数据库sqlserver2008登陆名密码登陆不了怎么办?
- JAVA EE(简述)
- Linux系统之用户、群组和权限
- Memcached在windows下的安装于使用
- hdu 4302 优先队列
- AndEngine
- POJ 3691 AC自动机上的dp
- this.IsMounted() is not a function
- 【转】【cocos2d-x教程】如何使用WebSocket
- jquery mobile event
- magent——memcached缓存代理服务器
- 正式学习 React(三)番外篇 reactjs性能优化之shouldComponentUpdate
- BT5 firefox Flash插件问题
- 随机模块_random
- 用Python语言开发VTK程序的步骤
- IT资产管理—采购与合同管理功能
- Android 倒计时按钮,倒计时发送短信验证码…
- NGUI的UISprite动态染色的一种方法
- Moving Swiftly(从OC切换到Swift)
- PHPCMS列表循环序列号自增标签代码