题意:
给出两个图,通过缩小,问两个图是否是相同的
缩小的时候不是按比例,比如说两行间距为三可以缩小为二,为6可以缩小为5
题解:
缩小过程用去重函数先去重,和lower_bound函数计算当前点可以缩小到某一行
旋转的话可以把图像先放到第二象限,然后转到第一象限即可,然后用稳定的快速排序进行排序即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAXN 520
struct Point
{
int x,y;
Point(){}
Point(int _x,int _y){
x=_x,y=_y;
}
};
int n,m;
Point a[MAXN],b[MAXN];
int x[MAXN],y[MAXN];
int cmp(const void *A,const void *B)
{
return *(int *)A - *(int *)B;
}
int xn,yn;
void deal(Point t[])
{
qsort(x,n,sizeof(x[0]),cmp);
qsort(y,n,sizeof(y[0]),cmp);
xn=unique(x,x+n)-x;
yn=unique(y,y+n)-y;
for(int i=0;i<n;i++){
t[i].x=lower_bound(x,x+xn,t[i].x)-x;
t[i].y=lower_bound(y,y+yn,t[i].y)-y;
}
}
int cmp1(const void *A,const void *B)
{
Point *_a=(struct Point*)A;
Point *_b=(struct Point*)B;
if(_a->x==_b->x)
return _a->y - _b->y;
return _a->x - _b->x;
}
bool judge()
{
qsort(a,n,sizeof(a[0]),cmp1);
qsort(b,n,sizeof(b[0]),cmp1);
for(int i=0;i<n;i++){
if(a[i].x!=b[i].x||a[i].y!=b[i].y)
return 0;
}
return 1;
}
void turn()
{
int t;
for(int i=0;i<n;i++){
t=a[i].x;
a[i].x=a[i].y;
a[i].y=xn-1-t;
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
x[i]=a[i].x;
y[i]=a[i].y;
}
deal(a);
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&b[i].x,&b[i].y);
x[i]=b[i].x;
y[i]=b[i].y;
}
int t1=xn,t2=yn;
deal(b);
if(n!=m||(t1!=xn||t2!=yn)){
puts("no");
continue;
}
int flag=0;
for(int i=0;i<4;i++){
if(judge()){
flag=1;
break;
}
turn();
}
puts(flag?"yes":"no");
}
return 0;
}