题目:http://codeforces.com/problemset/problem/465/D
题意:给你八个点,x,y,z,坐标没明确给出,求寻找一组组合,是的八个点形成正方体。是,输出YES,并打出每个点的排列;否,输出NO
分析:对于正方体,两点之间距离最多存在三种边,而其他图形不止三种边
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <cstdlib>
using namespace std;
int num[8][3];
set<long long>s;
long long sq(long long n)
{
return n*n;
}
long long dist(int a,int b)
{
return sq(num[a][0]-num[b][0])+sq(num[a][1]-num[b][1])+sq(num[a][2]-num[b][2]);
}
void dfs(int v)
{
if(v==8)
{
s.clear();
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(i==j) continue;
s.insert(dist(i,j));
if(s.size()>3) break;
}
}
if(s.size()==3)
{
puts("YES");
for(int i=0;i<8;i++) printf("%d %d %d\n",num[i][0],num[i][1],num[i][2]);
exit(0);
return;
}
return;
}
sort(num[v],num[v]+3);
do
{
dfs(v+1);
}while(next_permutation(num[v],num[v]+3));
}
int main()
{
for(int i=0;i<8;i++)
for(int j=0;j<3;j++)
cin>>num[i][j];
dfs(1);
puts("NO");
return 0;
}