题目来源: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; }