2020暑期牛客多校第三场C.Operation Love(找规律)

题目链接:https://ac.nowcoder.com/acm/contest/5668/C
解题思路:
以手掌的最下面那条长度为9的线为标准进行寻找
在这里插入图片描述
可以发现长度为6的是大拇指,长度为8的是小拇指,分别记手掌最下面的那条线连接小拇指的为small点(图中2点),连接大拇指的为big点(图中1点)
根据手掌五指的朝向(水平向左,向上,水平向右,向下四种情况,这四种情况可以根据大小拇指上下坐标关系来计算)来进行讨论即可,以手掌四指向上时为例,当big结点处的横坐标小于small结点横坐标时,此时相当于大拇指在左小拇指在右,所以肯定是右手,反之,左手

PS:因为数据是double类型,有小数,在计算的时候注意要算入误差,我写的时候是误差在0.1之内的都算作相同

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int t;
int pos;   //记录手掌最下面线的点的坐标
int small;
int big;
int up;      // 0表示平行向左  1向上 2平行向右 3向下
struct node{
	double x,y;
	double d;
}p[30];
int main(){
	scanf("%d",&t);
	while(t--){
		for(int i=0;i<20;i++){
			scanf("%lf%lf",&p[i].x,&p[i].y);
			if(i>0){
				p[i].d=sqrt((p[i].x-p[i-1].x)*(p[i].x-p[i-1].x)+((p[i].y-p[i-1].y)*(p[i].y-p[i-1].y)));
				if(fabs(p[i].d-9)<0.1)
					pos=i;
			}
		}
		//注意判断0这个结点位置
		p[0].d=sqrt((p[0].x-p[19].x)*(p[0].x-p[19].x)+((p[0].y-p[19].y)*(p[0].y-p[19].y)));
		if(fabs(p[0].d-9)<0.1)
				pos=0;
		int tmp=(pos+1)%20;     //tmp与pos组成小拇指或者大拇指的一条线,用来判断四指朝向
		if(fabs(p[tmp].d-8)<0.1){   //判断是不是小拇指
			small=pos;
			big=(pos-1+20)%20;
		}
		else{
			big=pos;
			small=(pos-1+20)%20;
		}
		if(p[tmp].y==p[pos].y&&p[tmp].x<p[pos].x){   //水平向右情况
			up=0;
			if(p[big].y<p[small].y)
				printf("right\n");
			else
				printf("left\n");
		}
		else if(p[tmp].y>p[pos].y){     //向上情况
			up=1;
			if(p[big].x<p[small].x)
				printf("right\n");
			else
				printf("left\n");

		}
		else if(p[tmp].y==p[pos].y&&p[tmp].x>p[pos].x){   //水平向右情况
			up=2;
			if(p[big].y>p[small].y)
				printf("right\n");
			else
				printf("left\n");
		}
		else if(p[tmp].y<p[pos].y){    //向下情况
			up=3;
			if(p[big].x>p[small].x)
				printf("right\n");
			else
				printf("left\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/107435403