题意给出8个点的坐标,问能不能通过重排每个点的坐标构成一个正方体,思路暴力枚举每个点的坐标排列,枚举到最后一个点的时候检查是否合法,代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[9][5],b[8];
LL dis(int i,int j)
{
LL x=a[i][0]-a[j][0],y=a[i][1]-a[j][1],z=a[i][2]-a[j][2];
return x*x+y*y+z*z;
}
bool check()
{
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
{
if(i==j)continue;
if(j<i)b[j]=dis(i,j);
else b[j-1]=dis(i,j);
}
sort(b,b+7);
LL t1=b[0],t2=2*b[0],t3=3*b[0];
///检查以i为起始点的三边,三面对角线,体对角线是否满足正方形约束
if(t1==0||t1!=b[1]||t1!=b[2]||t2!=b[3]||t2!=b[4]||t2!=b[5]||t3!=b[6])return false;
}
return true;
}
bool is_ok(int cur)
{
if(cur==8)
{
return check();
}
sort(a[cur],a[cur]+3);
do{
if(is_ok(cur+1))return true;
}while(next_permutation(a[cur],a[cur]+3));
return false;
}
int main()
{
for(int i=0;i<8;i++)
cin>>a[i][0]>>a[i][1]>>a[i][2];
if(!is_ok(0))puts("NO");
else
{
puts("YES");
for(int i=0;i<8;i++)
for(int j=0;j<3;j++)
{
cout<<a[i][j]<<' ';
if(j==2)cout<<endl;
}
}
return 0;
}