题目大意紫书和原文都讲的非常易懂清晰,
观察给出的数据范围:不超过1000个点,每个点坐标范围在-10000到10000之间!
直接暴力求解就可以了!
整体思路:
因为一撮点要轴对称的话,肯定有一个确定的对称轴,所以可以先找两个点,来确定对称轴,在一个一个扫描所有的点,看看是不是对称!
为了方便,可以直接找最左上和最右上的两个点,来确定对称轴!
有一个技巧:因为对称轴是要除以二的,不妨存点的时候,直接存坐标的二倍,以保证整数!
#include<cstdio>
using namespace std;
const int maxn = 1000 + 5;
struct point
{
int x,y;
}A[maxn];
int judge(int num,int N,int line){
for (int i = 0; i < N; ++i)if(A[num].x + A[i].x == 2 * line && A[num].y == A[i].y)return 1;
return 0;
}
int main()
{
int T,N,x,y,line,flag = 0,left = 0,right = 0;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
flag = left = right = 0;
for (int i = 0; i < N; ++i){
scanf("%d%d",&x,&y);
A[i] = (point){2 * x,2 * y};
}
for (int i = 0 ; i < N; ++i){
if (A[i].x < A[left].x)left = i;
else if (A[i].x == A[left].x && A[i].y > A[left].y)left = i;
if (A[i].x > A[right].x)right = i;
else if (A[i].x == A[right].x && A[i].y > A[right].y)right = i;
}
line = (A[left].x + A[right].x ) / 2;
for (int i = 0; i < N; ++i)if (!judge(i,N,line)){flag = 1;break;}
flag == 0 ? (printf("YES\n")) : (printf("NO\n"));
}
return 0;
}