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; }