C-Operation Love题目大意:逆时针或者顺时针给出二十个点,判断是左手还是右手

思路:

每两个相邻的点计算距离

找到距离为9的两个点(即手掌下面两个点)

标记一个点为a,一个点为b

然后找到除b以外,与a相邻的另一个点(下面记为lina)

假设a为左下角的点

将图旋转,使得b在a的右边,及b的x坐标比a的x坐标大9,记此点为cnt1

则点lina则在a的上方,lina的y坐标比a大dis(p[a],p[lina]),记为cnt2

根据相似三角形得到dis(p[lina],p[cnt2])与dis(p[b],p[cnt1])成比例

如果不成比例说明a是右下角的点

然后计算左下角的点与除a、b外相邻的点的距离

如果是6则是right

如果是8则是left

//卡精度就很难受,一开始1e-7,然后1e-6,没去试更大的,直到队友过了,我改成1e-4才过。
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define rep(a,b) for(int i=a,i<b;i++)
#define per(a,b) for(int i=a;i>=b;i--)
#define ll long long
double pi = acos(-1);
const double eps = 1e-4;
inline int dcmp(double x)//cmp x with 0
{
    if (fabs(x) <= eps)return 0;
    return x < 0 ? -1 : 1;
}
inline int cmp(double x, double y)
{
    //x>y return 1
    //x<y reutrn -1
    //x==y return 0
    return dcmp(x - y);
}
struct Point {
    double x, y;
    Point() {}
    Point(double xx, double yy) { x = xx; y = yy; }
    Point operator -(Point s) { return Point(x - s.x, y - s.y); }
    Point operator +(Point s) { return Point(x + s.x, y + s.y); }
    double operator *(Point s) { return x * s.x + y * s.y; }
    double operator ^(Point s) { return x * s.y - y * s.x; }
}p[21];
double len(Point a) { return sqrt(a * a); }
double dis(Point a, Point b) { return len(b - a); }
int T,a,b;
int main()
{
    cin>>T;
    while(T--){
        for(int i=0;i<20;i++){
            cin>>p[i].x>>p[i].y;
        }
        for(int i=0;i<20;i++){
            //cout<<dis(p[i],p[i+1==20?0:i+1])<<endl;
            if(!cmp(dis(p[i],p[i+1==20?0:i+1]),9.00)){
                a=i;
                b=(i+1==20?0:i+1);
            }
            //cout<<a<<' '<<b<<endl;
        }

        int lina,left,right;
        lina=((2*a-b)==20?0:(2*a-b));
        if(lina<0)lina+=20;
        if(lina>=20)lina-=20;
        Point cnt1,cnt2;
        cnt1.x=p[a].x+9;
        cnt1.y=p[a].y;//b点;
        cnt2.x=p[a].x;//与a相邻的点;
        cnt2.y=p[a].y+(dis(p[lina],p[a]));
        //cout<<cnt1.x<<' '<<cnt1.y<<' '<<cnt2.x<<' '<<cnt2.y<<endl;
        //cout<<dis(p[b],cnt1)<<' '<<dis(p[lina],p[a])<<' '<<dis(p[lina],cnt2)<<' '<<"9"<<endl;
        if(!cmp(dis(p[b],cnt1),0)&&!cmp(dis(p[lina],cnt2),0)){left=a;right=b;}
        else
        if(!cmp(dis(p[b],cnt1)*dis(p[lina],p[a]),dis(p[lina],cnt2)*9)){
            left=a;right=b;
        }else{
            left=b;right=a;
        }
        //cout<<' '<<b<<endl;
        int linleft=(2*left-right==20)?0:2*left-right;
        if(linleft<0) linleft+=20;
        if(linleft>=20)linleft-=20;
        //cout<<left<<' '<<linleft<<endl;
        if(!cmp(dis(p[left],p[linleft]),6)){
            //cout<<dis(p[left],p[linleft])<<endl;
            cout<<"right"<<endl;
        }else{
            //cout<<dis(p[left],p[linleft])<<endl;
            cout<<"left"<<endl;
        }
    }
    return 0;
}