[2020牛客暑期多校训练营第三场] C. Operation Love 计算几何

题目链接:C.Operation Love

题意:给你一个大小固定由20个点组成的手掌图形(分为左右手),将这个手掌通过旋转或平移,让你根据20个点的坐标判断该图形为左手还是右手。

[2020牛客暑期多校训练营第三场] C. Operation Love 计算几何_第1张图片

题解:可以取手掌两侧长度为6和8的两条边的点,由于这两条边的长度是独一无二的,所以我们可以遍历20个点找到长度为6和8两条边的端点(共四个)。此时虽然找到这四个点,但我们并不清楚长度为6的点对应的是这个边的1端点还是2端点(长度为8的点亦如此)。所以我们还需要用到两条边两个端点距离为9这个条件。这样我们就可以将这四个端点一一对应。

[2020牛客暑期多校训练营第三场] C. Operation Love 计算几何_第2张图片

确定这四个点后,我们可以找规律,题目说旋转,所以可将上图以45度方向顺时针旋转,得到8个图形。找出8个图形点与点之间规律即可。

right规律
(1)1在3上,2在1右
(2)1在3下,2在1左
(3)1、3同高,1在3右,2在1下
(4)1、3同高,1在3左,2在1上
否之则为left

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair

const double PI=acos(-1.0);
const double eps=1e-3;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e6+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

struct Point
{
	double x,y;
	Point():x(),y(){}
	Point(double x,double y):x(x),y(y){}
}point[25];

double dis(Point a,Point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

struct Line
{
	Point a,b;
	Line():a(),b(){}
	Line(Point a,Point b):a(a),b(b){}
};
int main()
{
	ios;
	int t;
	cin >> t;
	while(t--)
	{
		Line p8,p6;
		for(int i=0;i<20;i++) cin >> point[i].x >> point[i].y;
		for(int i=0;i<20;i++)
			for(int j=i+1;j<20;j++)
			{
				if(fabs(dis(point[i], point[j])-8)<=eps)
				{
					p8.a=point[i];
					p8.b=point[j];
				}
				if(fabs(dis(point[i], point[j])-6)<=eps)
				{
					p6.a=point[i];
					p6.b=point[j];
				}
			}
		Point p1,p2,p3,p4;
		if(fabs(dis(p8.a,p6.a)-9)<=eps)
		{
			p1=p6.a; p2=p6.b; p3=p8.a; p4=p8.b;	
		}
		else if(fabs(dis(p8.a,p6.b)-9)<=eps)
		{
			p1=p6.b; p2=p6.a; p3=p8.a; p4=p8.b;
		}
		else if(fabs(dis(p8.b,p6.a)-9)<=eps)
		{
			p1=p6.a,p2=p6.b,p3=p8.b,p4=p8.a;
		}
		else if(fabs(dis(p8.b,p6.b)-9)<=eps)
		{
			p1=p6.b,p2=p6.a,p3=p8.b,p4=p8.a;
		}
		if(p1.y>p3.y && p2.x>p1.x) cout << "right" << endl;
		else if(p1.y<p3.y && p2.x<p1.x) cout << "right" << endl;
		else if(p1.y==p3.y)
		{
			if(p1.x>p3.x && p2.y<p1.y) cout << "right" << endl;
			else if(p1.x<p3.x && p2.y>p1.y) cout << "right" << endl;
			else cout << "left" << endl;
		}
		else cout << "left" << endl;
	}
}

你可能感兴趣的:(计算几何)