标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 3967 | Accepted: 2489 |
Description

Input
Output
Sample Input
2 10 1 4 5 2 9 8 3 5 9 4 1 7 5 3 2 6 6 3 7 10 10 8 8 1 9 2 4 10 7 6 14 1 6 11 2 11 9 3 8 7 4 12 8 5 9 20 6 3 2 7 1 6 8 2 13 9 15 1 10 14 17 11 13 19 12 5 18 13 7 3 14 10 16
Sample Output
10 8 7 3 4 9 5 6 2 1 10 14 9 10 11 5 12 8 7 6 13 4 14 1 3 2
/*
poj 1696 叉积理解
给你n个点,要求从一个点出发,每次只能 左or直走. 求路径
先找出最做下角的点,然后通过叉积排序判断出离当前点需要旋转最小角度可以到达的点
如果两个点在一条直线上面,则选取距离最近的
hhh-2016-05-06 20:40:31
*/
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#include <functional>
#include <map>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
using namespace std;
const int maxn = 40010;
double eps = 1e-8;
int tot;
int n,m;
int sgn(double x)
{
if(fabs(x) < eps) return 0;
if(x < 0)
return -1;
else
return 1;
}
struct Point
{
int id;
double x,y;
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.y-y*b.x;
}
double operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
};
struct Line
{
Point s,t;
Line() {}
Line(Point _s,Point _t)
{
s = _s;
t = _t;
}
pair<int,Point> operator &(const Line&b)const
{
Point res = s;
if( sgn((s-t) ^ (b.s-b.t)) == 0) //通过叉积判断
{
if( sgn((s-b.t) ^ (b.s-b.t)) == 0)
return make_pair(0,res);
else
return make_pair(1,res);
}
double ta = ((s-b.s)^(b.s-b.t))/((s-t)^(b.s-b.t));
res.x += (t.x-s.x)*ta;
res.y += (t.y-s.y)*ta;
return make_pair(2,res);
}
};
Point tp;
Point po[maxn];
double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
bool cmp(Point a,Point b)
{
double t = (a-tp)^(b-tp);
if(sgn(t) == 0)
{
return dist(a,tp) < dist(b,tp);
}
if(sgn(t) < 0)
return false;
else
return true;
}
int main()
{
int n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d", &n);
tp.x = 10000,tp.y = 10000;
for(int i = 0; i < n; i++)
{
scanf("%d%lf%lf",&po[i].id,&po[i].x,&po[i].y);
if(po[i].y < tp.y || (po[i].y == tp.y && po[i].x < tp.x))
{
tp = po[i];
}
}
for(int i = 0; i < n; i++)
{
sort(po+i,po+n,cmp);
tp = po[i];
}
printf("%d ",n);
for(int i = 0; i < n; i++)
{
printf("%d%c",po[i].id, i == n-1 ? ‘\n‘:‘ ‘);
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/Przz/p/5510343.html