您的位置:首页 > 其它

Codeforces 464B. Restore Cube

2014-09-09 11:24 453 查看
暴力+枚举点用边长关系判断立方体

B. Restore Cube

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

Peter had a cube with non-zero length of a side. He put the cube into three-dimensional space in such a way that its vertices lay at integer points (it is possible that the cube's sides are not parallel to the coordinate axes). Then he took a piece of paper
and wrote down eight lines, each containing three integers — coordinates of cube's vertex (a single line contains coordinates of a single vertex, each vertex is written exactly once), put the paper on the table and left. While Peter was away, his little brother
Nick decided to play with the numbers on the paper. In one operation Nick could swap some numbers inside a single line (Nick didn't swap numbers from distinct lines). Nick could have performed
any number of such operations.

When Peter returned and found out about Nick's mischief, he started recollecting the original coordinates. Help Peter restore the original position of the points or else state that this is impossible and the numbers were initially recorded incorrectly.

Input

Each of the eight lines contains three space-separated integers — the numbers written on the piece of paper after Nick's mischief. All numbers do not exceed 106 in
their absolute value.

Output

If there is a way to restore the cube, then print in the first line "YES". In each of the next eight lines print three integers — the restored coordinates of
the points. The numbers in the i-th output line must be a permutation of the numbers in i-th
input line. The numbers should represent the vertices of a cube with non-zero length of a side. If there are multiple possible ways, print any of them.

If there is no valid way, print "NO" (without the quotes) in the first line. Do not print anything else.

Sample test(s)

input
0 0 0
0 0 1
0 0 1
0 0 1
0 1 1
0 1 1
0 1 1
1 1 1


output
YES
0 0 0
0 0 1
0 1 0
1 0 0
0 1 1
1 0 1
1 1 0
1 1 1


input
0 0 0
0 0 0
0 0 0
0 0 0
1 1 1
1 1 1
1 1 1
1 1 1


output
NO


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long int LL;

LL a[8][3];
LL ta[8][3];
LL sig[8][3];

LL SQ(LL x)
{
return x*x;
}

LL Dist(int u,int v)
{
return SQ(ta[u][0]-ta[v][0])+SQ(ta[u][1]-ta[v][1])+SQ(ta[u][2]-ta[v][2]);
}

bool check()
{
for(int yuan=0;yuan<8;yuan++)
{
LL dist[8];
int nd=0;
for(int i=0;i<8;i++)
{
if(i==yuan) continue;
dist[nd++]=Dist(yuan,i);
}
sort(dist,dist+7);
if(dist[0]==0LL) return false;
if(dist[0]!=dist[1]||dist[0]!=dist[2]||dist[1]!=dist[2])
return false;
if(dist[3]!=dist[4]||dist[3]!=dist[5]||dist[4]!=dist[5])
return false;
if(dist[0]*2!=dist[3]) return false;
if(dist[0]*3!=dist[6]) return false;
}
return true;
}

int main()
{
for(int i=0;i<8;i++)
for(int j=0;j<3;j++)
{
cin>>a[i][j];
sig[i][j]=j;
}
do
{
do
{
do
{
do
{
do
{
do
{
do
{
do
{
for(int i=0;i<8;i++)
{
for(int j=0;j<3;j++)
{
ta[i][j]=a[i][sig[i][j]];
}
}

if(check())
{
puts("YES");
for(int i=0;i<8;i++)
{
for(int j=0;j<3;j++)
cout<<ta[i][j]<<" ";
cout<<endl;
}
return 0;
}

}while( next_permutation(sig[7],sig[7]+3) );
}while( next_permutation(sig[6],sig[6]+3) );
}while( next_permutation(sig[5],sig[5]+3) );
}while( next_permutation(sig[4],sig[4]+3) );
}while( next_permutation(sig[3],sig[3]+3) );
}while( next_permutation(sig[2],sig[2]+3) );
}while( next_permutation(sig[1],sig[1]+3) );
}while( next_permutation(sig[0],sig[0]+3) );

puts("NO");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: