Operation Love
题目链接:链接
题目大意:
给出爱丽丝的右手,由二十个点组成,已知她的左手和右手对称,然后给出二十个点,问这些点组成的手是左手还是右手。
思路:
计算长度为 6 和 9 这两个向量的叉积,如果相乘为正数,则为逆时针,为右手,反之是左手。
如图,将长度为6的向量平移之后,右手为逆时针,左手为顺时针。
左手:
ps:旋转不影响叉积符号正负。
叉积详解+例题:叉积
Code;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-5
using namespace std;
struct node{
double x,y;
}nod[25];
int t;
double cal(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
scanf("%d",&t);
while(t--)
{
for(int i = 0;i < 20;i++)
scanf("%lf%lf",&nod[i].x,&nod[i].y);
int m,n,p;
for(int i = 0;i < 20;i++)
{
for(int j = i+1;j < 20;j++)
{
if(fabs(cal(nod[i],nod[j])-9.0) < eps)
m = i,n = j;
}
}
bool ok = false;
for(int i = 0;i < 20;i++)
{
if(fabs(cal(nod[i],nod[m])-6.0) < eps)
{
p = i;
ok = true;
}
if(fabs(cal(nod[i],nod[n])-6.0) < eps)
{
p = i;
}
}
if(!ok) swap(m,n);
node a,b;
a.x = nod[n].x-nod[m].x;
a.y = nod[n].y-nod[m].y;
b.x = nod[p].x-nod[m].x;
b.y = nod[p].y-nod[m].y;
double judge = a.x*b.y-a.y*b.x;
if(judge > 0) puts("right");
else puts("left");
}
return 0;
}