uva-1595 Symmetry 题解

该篇文章介绍了一个编程问题,涉及寻找二维平面上一组点关于某条竖直线的对称轴。通过排序x坐标,检查是否存在对称轴,然后验证所有点的对称点是否也在给定点集中。文章强调了在使用集合时重载比较运算符的重要性,以及避免比较操作中的模糊定义。
摘要由CSDN通过智能技术生成

题面

原题链接


思路

注意到题目要求为找一条竖线一开始以为是随便找一条对称轴然后无从下手。

首先我们仅从x坐标入手,看看能不能找到众多x坐标的对称轴,如果找不到,显然输出NO;如果找到,再遍历所有点,看看这些点对称过去得到的点是否也存在于图中,如果都满足,输出YES,反之输出NO。


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
struct point{
    int x,y;
    point(int a=0,int b=0){
        this->x=a;this->y=b;
    }
};
bool operator<(point a,point b){
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}
set<point> p_set;
vector<int> x_vec;
void clear(){
    p_set.clear();
    x_vec.clear();
}
int main(){
    int t;
    cin>>t;
    while(t--){
        clear();
        int n,x,y;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>x>>y;
            point p(x,y);
            x_vec.push_back(x);
            p_set.insert(p);
        }
        sort(x_vec.begin(),x_vec.end());
        int x_n=x_vec.size(),m;
        m=x_vec[0]+x_vec[x_n-1];
        for(int i=0,j=x_n-1;i<=j;i++,j--){
            if(m!=x_vec[i]+x_vec[j]){
                cout<<"NO\n";
                goto end;
            }
        }
        for(set<point>::iterator it=p_set.begin();it!=p_set.end();it++){
            point p0(m-it->x,it->y);
            if(p_set.count(p0)==0){
                cout<<"NO\n";
                goto end;
            }
        }
        cout<<"YES"<<endl;
        end:;
    }
    return 0;
}

值得一提的是,构建自定义类型的set需要重载运算符<,使自定义类型可以比较。并且重载小于号时切记不能模糊定义,因为这影响到set中许多函数的使用。我一开始为了方便只比较了x,最后在使用时产生较大的问题,究其原因,大概是程序把所有x相同的point都认为是同一个point了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值