分析
通过存储每个点来记录图形的信息。
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;
}