5-6 UVA 1595 Symmetry对称轴

来源:互联网 发布:步鑫生失败原因 知乎 编辑:程序博客网 时间:2024/04/30 01:53

题目大意紫书和原文都讲的非常易懂清晰,

观察给出的数据范围:不超过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;}


0 0
原创粉丝点击