题目链接:https://ac.nowcoder.com/acm/contest/5668/C
解题思路:
以手掌的最下面那条长度为9的线为标准进行寻找
可以发现长度为6的是大拇指,长度为8的是小拇指,分别记手掌最下面的那条线连接小拇指的为small点(图中2点),连接大拇指的为big点(图中1点)
根据手掌五指的朝向(水平向左,向上,水平向右,向下四种情况,这四种情况可以根据大小拇指上下坐标关系来计算)来进行讨论即可,以手掌四指向上时为例,当big结点处的横坐标小于small结点横坐标时,此时相当于大拇指在左小拇指在右,所以肯定是右手,反之,左手
PS:因为数据是double类型,有小数,在计算的时候注意要算入误差,我写的时候是误差在0.1之内的都算作相同
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int t;
int pos; //记录手掌最下面线的点的坐标
int small;
int big;
int up; // 0表示平行向左 1向上 2平行向右 3向下
struct node{
double x,y;
double d;
}p[30];
int main(){
scanf("%d",&t);
while(t--){
for(int i=0;i<20;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
if(i>0){
p[i].d=sqrt((p[i].x-p[i-1].x)*(p[i].x-p[i-1].x)+((p[i].y-p[i-1].y)*(p[i].y-p[i-1].y)));
if(fabs(p[i].d-9)<0.1)
pos=i;
}
}
//注意判断0这个结点位置
p[0].d=sqrt((p[0].x-p[19].x)*(p[0].x-p[19].x)+((p[0].y-p[19].y)*(p[0].y-p[19].y)));
if(fabs(p[0].d-9)<0.1)
pos=0;
int tmp=(pos+1)%20; //tmp与pos组成小拇指或者大拇指的一条线,用来判断四指朝向
if(fabs(p[tmp].d-8)<0.1){ //判断是不是小拇指
small=pos;
big=(pos-1+20)%20;
}
else{
big=pos;
small=(pos-1+20)%20;
}
if(p[tmp].y==p[pos].y&&p[tmp].x<p[pos].x){ //水平向右情况
up=0;
if(p[big].y<p[small].y)
printf("right\n");
else
printf("left\n");
}
else if(p[tmp].y>p[pos].y){ //向上情况
up=1;
if(p[big].x<p[small].x)
printf("right\n");
else
printf("left\n");
}
else if(p[tmp].y==p[pos].y&&p[tmp].x>p[pos].x){ //水平向右情况
up=2;
if(p[big].y>p[small].y)
printf("right\n");
else
printf("left\n");
}
else if(p[tmp].y<p[pos].y){ //向下情况
up=3;
if(p[big].x>p[small].x)
printf("right\n");
else
printf("left\n");
}
}
return 0;
}