Operation Love

题目链接:链接

题目大意:

给出爱丽丝的右手,由二十个点组成,已知她的左手和右手对称,然后给出二十个点,问这些点组成的手是左手还是右手。

爱丽丝的右手

思路:

计算长度为 6 和 9 这两个向量的叉积,如果相乘为正数,则为逆时针,为右手,反之是左手。

在这里插入图片描述

如图,将长度为6的向量平移之后,右手为逆时针,左手为顺时针。

在这里插入图片描述
左手:
在这里插入图片描述

ps:旋转不影响叉积符号正负。

叉积详解+例题:叉积

Code;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-5
using namespace std;
struct node{
    double x,y;
}nod[25];
int t;
double cal(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        for(int i = 0;i < 20;i++)
            scanf("%lf%lf",&nod[i].x,&nod[i].y);
        int m,n,p;
        for(int i = 0;i < 20;i++)
        {
            for(int j = i+1;j < 20;j++)
            {
                if(fabs(cal(nod[i],nod[j])-9.0) < eps)
                    m = i,n = j;
            }
        }
        bool ok = false;
        for(int i = 0;i < 20;i++)
        {
            if(fabs(cal(nod[i],nod[m])-6.0) < eps)
            {
                p = i;
                ok = true;
            }
            if(fabs(cal(nod[i],nod[n])-6.0) < eps)
            {
                p = i;
            }
        }
        if(!ok) swap(m,n);
        node a,b;
        a.x = nod[n].x-nod[m].x;
        a.y = nod[n].y-nod[m].y;
        b.x = nod[p].x-nod[m].x;
        b.y = nod[p].y-nod[m].y;
        double judge = a.x*b.y-a.y*b.x;
        if(judge > 0) puts("right");
        else puts("left");
    }
    return 0;
}