pku2526

本文介绍了一种算法,用于判断平面上多个点组成的线段组是否都相交于同一点。通过找到x和y坐标的最大最小值来确定可能的交点位置,并验证其余点是否符合该条件。

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

 给定平面中的若干点,判断是否存在由这些点构成的线段组中所有线段都交于一点。对于x坐标,找出最大和最小值,对应的两个点一定要构成一条线段,那么中点的x坐标就确定了,同理对于y坐标,注意这两组点不一定相同。然后对其他点,根据中点求出另一个点,查找是否在给定的点集中即可。

Source:

 

#include<iostream>
#include
<algorithm>
#include
<utility>
using namespace std;

bool cmp(pair<int,int> a,pair<int,int> b);

pair
<int,int> pp[10010],mid,tmp;

int main()
{
    
int cse,i,n,mxi,mii,mxj,mij;
    cin
>>cse;
    
for(;cse>0;--cse)
    {
        cin
>>n;
        
for(i=0;i<n;++i)
        {
            cin
>>pp[i].first>>pp[i].second;
            
if(i==0)
            {
                mxi
=pp[i].first;
                mii
=pp[i].first;
                mxj
=pp[i].second;
                mij
=pp[i].second;
            }
else 
            {
                
if(pp[i].first<mii)
                    mii
=pp[i].first;
                
if(pp[i].first>mxi)
                    mxi
=pp[i].first;
                
if(pp[i].second<mij)
                    mij
=pp[i].second;
                
if(pp[i].second>mxj)
                    mxj
=pp[i].second;
            }
        }
        sort(pp,pp
+n,cmp);
        mid.first
=mii+mxi;
        mid.second
=mij+mxj;
//        if(n%2==0)
//        {
//            i=n/2;
//            mid.first=pp[i].first+pp[i-1].first;
//            mid.second=pp[i].second+pp[i-1].second;
//        }else
//        {
//            i=n/2;
//            mid.first=2*pp[i].first;
//            mid.second=2*pp[i-1].second;
//        }
        for(--i;i>=0;--i)
        {
            tmp.first
=mid.first-pp[i].first;
            tmp.second
=mid.second-pp[i].second;
            
if(!binary_search(pp,pp+n,tmp))break;
        }
        
if(i<0)
            cout
<<"yes"<<endl;
        
else 
            cout
<<"no"<<endl;
    }
}

bool cmp(pair<int,int> a,pair<int,int> b)
{
    
return a.first<b.first || a.first==b.first && a.second<b.second;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值