题意:
给出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;
}
时间: 2024-11-14 04:07:10