「CF464B」Restore Cube
题解
题意给定三维空间内8个点,每个点的xyz坐标被打乱,问是否能通过调整每个点的xyz坐标使得这八个点构成一个正方体。。。
我会告诉你我不知道正方体可以不平行于坐标轴wa飞了?
显然这题是个6^8搜索。。。
判断正方体可以通过任意一个顶点到其余七个顶点的距离判断
注意坐标全为0的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #define pa pair<int,int> #define inf 1000000000 #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } bool flag; int a[15][5],b[15][5],ans[15][5]; int c[6][3]={1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1}; ll dis(int x,int y) { return (ll)(b[x][1]-b[y][1])*(b[x][1]-b[y][1])+(ll)(b[x][2]-b[y][2])*(b[x][2]-b[y][2])+(ll)(b[x][3]-b[y][3])*(b[x][3]-b[y][3]); } bool jud() { ll a[10]; for(int x=1;x<=8;x++) { for(int i=1;i<=8;i++) a[i-1]=dis(i,x); sort(a,a+8); ll t=a[1];if(t==0)return 0; for(int i=1;i<=3;i++)if(a[i]!=t)return 0; for(int i=4;i<=6;i++)if(a[i]!=2*t)return 0; if(a[7]!=3*t)return 0; } return 1; } void dfs(int x) { if(flag)return; if(x==9) { if(jud()) { flag=1; for(int i=1;i<=8;i++) for(int j=1;j<=3;j++) ans[i][j]=b[i][j]; } return; } for(int i=0;i<6;i++) { for(int j=0;j<3;j++) b[x][j+1]=a[x][c[i][j]]; dfs(x+1); } } int main() { for(int i=1;i<=8;i++) for(int j=1;j<=3;j++) a[i][j]=read(); dfs(1); if(flag) { puts("YES"); for(int i=1;i<=8;i++) { for(int j=1;j<=3;j++) printf("%d ",ans[i][j]); puts(""); } } else puts("NO"); return 0; } |
Subscribe