CODEFORCES 465D Restore Cube <寻找正方体>

来源:互联网 发布:java程序培训学费 编辑:程序博客网 时间:2024/05/21 17:34

题目: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;}


0 0