L3-006 迎风一刀斩 (几何)

分析

通过存储每个点来记录图形的信息。
1.当两个图形的直角数目都等于他们各自图形的点数减去二,同时两个图形非直角的两个角都可以相互拼接成pi(派)或者pi/2(派的一半),那么如果他们非直角之间的线长度相等,则输出yes。
2.当两个图形的直角数目都等于4,那么只要他们任意一个边互相相等,输出yes。

C++代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int T,n,m,fenzi,fenmu;
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
typedef pair<int,int> PII;
PII a[10],b[10];
void ck(PII a[],int n,int &X,int &x,int &Y,int &y,int &st)
{
    X=x=Y=y=st=0;
    for (int i=0;i<n;i++) 
    {
        if (a[i].first==a[(i+1)%n].first) 
        {
            st++;
            int t=abs(a[i].second-a[(i+1)%n].second);
            if (t>Y) y=Y,Y=t;
            else y=t;
            //cout<<"----"<<y<<" "<<st<<endl;
        } 
        else if (a[i].second==a[(i+1)%n].second) 
        {
            st++;
            int t=abs(a[i].first-a[(i+1)%n].first);
            if (t>X) 
            {
            	x=X,X=t;
            }
            else 
            {
            	x=t;
            }
            //cout<<"----"<<x<<" "<<st<<endl;
        }
    }
}
bool pet(int n,int m)
{
    int x,X,y,Y,st;
    ck(b,m,X,x,Y,y,st);
    if (st!=m-1) 
    	return 0;
    int A=Y-y,B=X-x;
    ck(a,n,X,x,Y,y,st);
    if (st!=n-1) 
    	return 0;
    return (X==A&&Y==B)||(X==B&&Y==A);
}
bool jdg()
{
    int x,X,y,Y,st;
    ck(b,4,X,x,Y,y,st);
    if (st<3) return 0;
    if (st==4) 
    {
        int A=X,B=Y;
        ck(a,4,X,x,Y,y,st);
        if (st!=4) 
        	return false;
        return A==X||A==Y;
    }
    int hh,A,B;
    if(y==0) 
    {
        hh=Y;A=X;B=x;
    } 
    else 
    {
        hh=X;A=Y;B=y;
    }
    ck(a,4,X,x,Y,y,st);
    if (st<3) return 0;
    if (y==0) return hh==Y&&x+A==X+B;
    else return hh;
}
int main()
{
	int x,y;
    scanf("%d",&T);
    while (T--) 
    {
        scanf("%d",&n);
        for (int i=0;i<n;i++) 
        {
            scanf("%d%d",&x,&y);
            a[i]={x,y};
        }
        scanf("%d",&m);
        for (int i=0;i<m;i++) 
        {
            scanf("%d%d",&x,&y);
            b[i]={x,y};
        }
        if(n>m) 
        {
            swap(n,m); swap(a,b);
        }
        bool flag=0;
        if(n==4&&m==4) flag=jdg();
        else flag=pet(n,m);
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值