2020牛客暑期多校训练营(第三场)C

 

 

 

 

 

 

 题意:输入是从任意一点出发顺时针或逆时针把20个点输入,然后这个手是可以移动和旋转的,不能缩放,然后判断是左手还是右手,左手输出left ,右手输出right.

注意:这里由于输入是浮点数,所以那个sqrt后的值不为整数值

代码:

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn = 25;
double x[maxn],y[maxn];
double d[maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        for(int i=1;i<=20;i++){
            scanf("%lf%lf",&x[i],&y[i]);
        }
        x[21]=x[1];
        y[21]=y[1];
        double tot=0;
        for(int i=1;i<=20;i++){
            d[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
            tot+=x[i]*y[i+1]-x[i+1]*y[i];
        }
        if(tot<0){
            reverse(d+1,d+21);//保证逆时针 
        }
        int a,b;
        for(int i=1;i<=20;i++){
            if(int(d[i]+0.5)==9)
                a=i;
            if(int(d[i]+0.5)==8)
                b = i;
            
        }
        int flag=0;
        if(a+1==b)
            flag=1;
        if(a==20&&b==1)//逆时针保证边长为9和边长为8的出现的先后顺序
            flag=1;
        if(flag) cout<<"right"<<endl;
        else cout<<"left"<<endl; 
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/lusiqi/p/13342166.html