题面:
题意:
题图给定的是右手,左手与右手完全对称。
每只手由20个点组成。
输入每次按照顺时针或者逆时针给定20个点,判断这些点组成的左右还是右手,其中给定的点是由题图的点旋转或者平移后保留6位小数得到,不会放大或者缩小。
题解:
选择(1,0),(1,6),(10,0)三个点叉积判断正负即可。
因为给定的点是处理后保留的六位小数,且每条边相差较大,eps设置大于1e-6,设置为1e-1即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
//#define len(x) (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=998244353;
const double eps=1e-1;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=2000100;
const int maxp=1100;
const int maxm=100100;
const int up=100000;
int sgn(double x)
{
if(abs(x)<eps) return 0;
if(x<0) return -1;
return 1;
}
struct Point
{
double x,y;
Point(){}
Point(double xx,double yy)
{
x=xx,y=yy;
}
void input(void)
{
scanf("%lf%lf",&x,&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 dis(const Point &b) const
{
return hypot(x-b.x,y-b.y);
}
};
Point p[25];
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i=19;i>=0;i--)
p[i].input();
Point a,b,c;
for(int i=0;i<20;i++)
{
if(sgn(p[i].dis(p[(i+1)%20])-6)==0)
{
if(sgn(p[i].dis(p[(i-1+20)%20])-9)==0)
{
a=p[i],b=p[(i+1)%20],c=p[(i-1+20)%20];
}
else
{
a=p[(i+1)%20],b=p[i],c=p[(i+2)%20];
}
}
}
if(((b-a)^(c-a))<0) printf("right\n");
else printf("left\n");
}
return 0;
}