题目大意:
给出20个坐标(顺逆时针都可能),确定是爱丽丝的左手掌还是右手掌
题目思路:
先找到具有代表性的长度为9的手掌向量,然后计算与其相连的两条向量的叉乘,若属于大拇指的向量与长度为9的向量的叉乘小于0,且属于小拇指的向量与长度为9的向量的叉乘大于零,则这是右手掌,若反之前者叉乘大于0,后者叉乘小于0,则是左手掌
#include<bits/stdc++.h>
using namespace std;
struct zb
{
double x,y;
} a[30];
double dis(zb x,zb y) //边长
{
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
double cj(zb x,zb y,zb 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;
const double e=1e-5;
scanf("%d",&t);
while(t--)
{
flag=0;
for(i=0;i<20;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(i=0;i<20;i++)
if(fabs(dis(a[i],a[(i+1)%20])-9)<e)
{
po x=a[i],y=a[(i+1)%20],z=a[(i+2)%20];
if(cj(x,y,z)>0 && fabs(dis(y,z)-6)<e || cj(x,y,z)<0 && fabs(dis(y,z)-8)<e) flag=1;
break;
}
if(flag)
printf("left\n");
else
printf("right\n");
}
return 0;
}
!!!代码搬自题解讨论区!!!