UVA 1595 Symmetry (set)

本文介绍了一种算法,用于判断平面上的点集是否存在一条竖直的对称轴。通过计算所有点横坐标的平均值确定可能的对称轴位置,并利用自定义结构体的set来存储和查找对称点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意

给出平面上n个点,问是否存在这样的一条竖线,使得所有点左右对称

解决

  1. 根据所有点的横坐标之和求出平均值,即为竖线的水平位置
  2. 输入的时候把点存在自定义结构体的set中
  3. 遍历每一个点,看是否能在set中查找到关于竖线对称的点,找不到的话就不存在
struct point
{
    int x,y;
    point(){}
    point(int xx,int yy)
    {
        x=xx;y=yy;
    }
        //如果使用自定义结构体的set,需要重载小于号
    bool operator<(const point &p2)const
    {
        if(x==p2.x) return y<p2.y;
        else return x<p2.x;
    }
};

int main()
{
    //open();
    int cases;
    scanf("%d",&cases);
    while(cases--)
    {
        set<point> myset;
        int n,a,b;
        double sum=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            sum+=a;
            myset.insert(point(a,b));
        }
        sum/=n;
        bool ok=true;
        set<point>::iterator it;
        set<point>::iterator it2;
        for(it=myset.begin();it!=myset.end();it++)
        {
            point ans=*it;
            point aim(2*sum-ans.x,ans.y);
            it2=myset.find(aim);
            if(it2==myset.end())    //找不到的话find返回end
            {
                ok=false;
                break;
            }
        }
        if(ok) puts("YES");
        else puts("NO");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值