C-Operation Love题目大意:逆时针或者顺时针给出二十个点,判断是左手还是右手
思路:
每两个相邻的点计算距离
找到距离为9的两个点(即手掌下面两个点)
标记一个点为a,一个点为b
然后找到除b以外,与a相邻的另一个点(下面记为lina)
假设a为左下角的点
将图旋转,使得b在a的右边,及b的x坐标比a的x坐标大9,记此点为cnt1
则点lina则在a的上方,lina的y坐标比a大dis(p[a],p[lina]),记为cnt2
根据相似三角形得到dis(p[lina],p[cnt2])与dis(p[b],p[cnt1])成比例
如果不成比例说明a是右下角的点
然后计算左下角的点与除a、b外相邻的点的距离
如果是6则是right
如果是8则是left
//卡精度就很难受,一开始1e-7,然后1e-6,没去试更大的,直到队友过了,我改成1e-4才过。
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define rep(a,b) for(int i=a,i<b;i++)
#define per(a,b) for(int i=a;i>=b;i--)
#define ll long long
double pi = acos(-1);
const double eps = 1e-4;
inline int dcmp(double x)//cmp x with 0
{
if (fabs(x) <= eps)return 0;
return x < 0 ? -1 : 1;
}
inline int cmp(double x, double y)
{
//x>y return 1
//x<y reutrn -1
//x==y return 0
return dcmp(x - y);
}
struct Point {
double x, y;
Point() {}
Point(double xx, double yy) { x = xx; y = yy; }
Point operator -(Point s) { return Point(x - s.x, y - s.y); }
Point operator +(Point s) { return Point(x + s.x, y + s.y); }
double operator *(Point s) { return x * s.x + y * s.y; }
double operator ^(Point s) { return x * s.y - y * s.x; }
}p[21];
double len(Point a) { return sqrt(a * a); }
double dis(Point a, Point b) { return len(b - a); }
int T,a,b;
int main()
{
cin>>T;
while(T--){
for(int i=0;i<20;i++){
cin>>p[i].x>>p[i].y;
}
for(int i=0;i<20;i++){
//cout<<dis(p[i],p[i+1==20?0:i+1])<<endl;
if(!cmp(dis(p[i],p[i+1==20?0:i+1]),9.00)){
a=i;
b=(i+1==20?0:i+1);
}
//cout<<a<<' '<<b<<endl;
}
int lina,left,right;
lina=((2*a-b)==20?0:(2*a-b));
if(lina<0)lina+=20;
if(lina>=20)lina-=20;
Point cnt1,cnt2;
cnt1.x=p[a].x+9;
cnt1.y=p[a].y;//b点;
cnt2.x=p[a].x;//与a相邻的点;
cnt2.y=p[a].y+(dis(p[lina],p[a]));
//cout<<cnt1.x<<' '<<cnt1.y<<' '<<cnt2.x<<' '<<cnt2.y<<endl;
//cout<<dis(p[b],cnt1)<<' '<<dis(p[lina],p[a])<<' '<<dis(p[lina],cnt2)<<' '<<"9"<<endl;
if(!cmp(dis(p[b],cnt1),0)&&!cmp(dis(p[lina],cnt2),0)){left=a;right=b;}
else
if(!cmp(dis(p[b],cnt1)*dis(p[lina],p[a]),dis(p[lina],cnt2)*9)){
left=a;right=b;
}else{
left=b;right=a;
}
//cout<<' '<<b<<endl;
int linleft=(2*left-right==20)?0:2*left-right;
if(linleft<0) linleft+=20;
if(linleft>=20)linleft-=20;
//cout<<left<<' '<<linleft<<endl;
if(!cmp(dis(p[left],p[linleft]),6)){
//cout<<dis(p[left],p[linleft])<<endl;
cout<<"right"<<endl;
}else{
//cout<<dis(p[left],p[linleft])<<endl;
cout<<"left"<<endl;
}
}
return 0;
}

京公网安备 11010502036488号