题目来源:https://ac.nowcoder.com/acm/contest/5668/C

题意:按顺时针或逆时针顺序给出手掌每个端点的平面坐标,输出每个手印是左手还是右手。形状可以旋转和平移,但是不会被放大或缩小。爱丽丝的左手掌形状与她的右手掌对称。

做题历程:初看此题以为是一个统计图一样的玩意,后来发现是每次给20点,通过这20个点判断左右手,这就需要去寻找几何规律了。

解题思路:首先根据题目的几个样例寻找其中的几何关系,运用这个几何关系我们来寻找判断左右手的一般性规律。可以发现,手掌下方的这一条边是最长的,而这条边到大拇指的距离为6,到小拇指的离为8。所以只要找出这条唯一长9的边,然后找之前与之后边的长度。但是如果是左右手之分的话,由于输入的方向不一样,所以要考虑用向量来判断,因为这有方向,找出手掌的左右。在这种情况下,需要判断向量积的结果正负就行了。

#include<bits/stdc++.h>
using namespace std;  
const double ant=100001;
    struct po
    {
        double x,y;
    } a[30];

    double bian(po x,po y) //算得边长 
    {
        return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
    }
    double xlj(po x,po y,po z) //向量积 
    {
        return (y.x-x.x)*(z.y-x.y)-(y.y-x.y)*(z.x-y.x);
    }
    int main()
    {
        int t,i;
        bool flag;
        cin>>t;
        while(t--)
        {
            flag=0;
            for(i=0;i<20;i++)
             cin>>a[i].x>>a[i].y;    
            for(i=0;i<20;i++)
            if(fabs(bian(a[i],a[(i+1)%20])-9)<ant)
             {
                po x=a[i],y=a[(i+1)%20],z=a[(i+2)%20];
                if(xlj(x,y,z)>0&&fabs(bian(y,z)-6)<ant||xlj(x,y,z)<0&&fabs(bian(y,z)-8)<ant) 
                flag=1;
                break;
             }        
            if(flag) 
            cout<<"left"<<endl;
            else 
            cout<<"right"<<endl;
        }
        return 0;
    }