题目来源: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;
}
京公网安备 11010502036488号