[思维]CodeForces 135B

本文提供了一种简洁而高效的算法,用于解决在一组点中找到两个集合,其中一个形成正方形,另一个形成矩形的问题。通过枚举所有边的排列并根据边长进行判断,该算法避免了复杂的数学运算,简化了解题过程。

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

题意:
给出8个点,问能否分成两个集合,使得一个组成正方形,另一个组成矩形。如果能,就输出YES,并且输出两个集合分别是什么,如果能,那就直接输出NO;

分析:
本来觉得这题很烦,没什么兴趣做了,浏览status的时候,偶然发现某final爷的id,点进去亮瞎了双眼。。。代码精简美观,思路一样很暴力,但是暴力的漂亮,于是乎学习了一下。
思路就是判断所有的边的可能排列,然后根据边判断,不用什么点积来做了。亲测正常点的做法起码要100++,细节错误的话还容易WA。这样暴力的话就不用烦恼这些了。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 1000005
using namespace std;
int p[]={0,1,2,3,4,5,6,7,8};
int x[9],y[9];
int d(int a,int b)
{
    return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]);
}
int main()
{
   // read;
    int i,j;
    for(i=1;i<=8;i++)scanf("%d%d",&x[i],&y[i]);

    do
    {
        if(d(p[1],p[2])==d(p[2],p[3]) && d(p[2],p[3])==d(p[3],p[4]) && d(p[3],p[4])==d(p[4],p[1]) && d(p[1],p[3])==d(p[4],p[2])
           && d(p[5],p[6])==d(p[7],p[8]) && d(p[5],p[8])==d(p[6],p[7]) && d(p[5],p[7])==d(p[6],p[8]))
           {
               return printf("YES\n%d %d %d %d\n%d %d %d %d\n",p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8]),0;
           }
    }while(next_permutation(p+1,p+9));
    puts("NO");
    return 0;




}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值