题意:
给出两个图,通过缩小,问两个图是否是相同的
缩小的时候不是按比例,比如说两行间距为三可以缩小为二,为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; }