[恢复状态] Gym 100851A
题意:
给你8个立方体的位置,问能不能折成一个四维的东西
感觉作者脑洞好大..
做法:
我们观察二维的
显然,以下情况是可以的
OOO
OOO
那么在此情况下,我们可以发现
123
456
1-3对面;2-5对面;3-6对面
我们只要考虑,x-y对面即可,那么x-y对面的情况经过观察若干种(以下1-4对面,2-5对面,3-6对面)
1
2356
4
1
23
45
6
之类的
可以发现,1在向右以后,上下若干步,再往右的即是1的对立面
同理,1向下以后,向左右若干步是1的对立面
如此,我们就得到算法,向某个方向走一步,之后沿其他方向若干步再沿着这个方向一步即可
那么我们就找到所有的对立面即可..dfs吧
代码:
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char a[15][15][15]; bool visit[15][15][15]; int paired[15]; void dfs(int x,int y,int z,int t,int k) { if ((x<0)||(y<0)||(z<0)) return; if ((x>7)||(y>7)||(z>7)) return; if (a[x][y][z]=='.') return; if (visit[x][y][z]) return; visit[x][y][z]=1; if (t==0) { if ((x+1<8)&&(a[x+1][y][z]!='.')) { int p=a[x+1][y][z]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=1) { dfs(x+1,y,z,t,k); } if (t==1) { if ((x-1>=0)&&(a[x-1][y][z]!='.')) { int p=a[x-1][y][z]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=0) { dfs(x-1,y,z,t,k); } if (t==2) { if ((y+1<8)&&(a[x][y+1][z]!='.')) { int p=a[x][y+1][z]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=3) { dfs(x,y+1,z,t,k); } if (t==3) { if ((y-1>=0)&&(a[x][y-1][z]!='.')) { int p=a[x][y-1][z]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=2) { dfs(x,y-1,z,t,k); } if (t==4) { if ((z+1<8)&&(a[x][y][z+1]!='.')) { int p=a[x][y][z+1]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=5) { dfs(x,y,z+1,t,k); } if (t==5) { if ((z-1>=0)&&(a[x][y][z-1]!='.')) { int p=a[x][y][z-1]; if ((p!=k)&&(p!=paired[k])) { if (paired[k]!=-1) { puts("No"); exit(0); } paired[k]=p; } } } else if (t!=4) { dfs(x,y,z-1,t,k); } } int main() { freopen("hypercube.in","r",stdin); freopen("hypercube.out","w",stdout); int n,m,k; scanf("%d%d%d",&m,&n,&k); int i,j,l; int sum=0; memset(a,'.',sizeof(a)); memset(paired,-1,sizeof(paired)); for (i=0;i<k;i++) { for (j=0;j<n;j++) { scanf("%s",a[i][j]); for (l=0;l<m;l++) { if (a[i][j][l]=='x') { a[i][j][l]=sum++; } } a[i][j][l]='.'; } } for (i=0;i<k;i++) { for (j=0;j<n;j++) { for (l=0;l<m;l++) { if (a[i][j][l]!='.') { memset(visit,0,sizeof(visit)); dfs(i-1,j,l,1,a[i][j][l]); memset(visit,0,sizeof(visit)); dfs(i+1,j,l,0,a[i][j][l]); memset(visit,0,sizeof(visit)); dfs(i,j-1,l,3,a[i][j][l]); memset(visit,0,sizeof(visit)); dfs(i,j+1,l,2,a[i][j][l]); memset(visit,0,sizeof(visit)); dfs(i,j,l-1,5,a[i][j][l]); memset(visit,0,sizeof(visit)); dfs(i,j,l+1,4,a[i][j][l]); } } } } for (i=0;i<8;i++) { if (paired[paired[i]]!=i) { puts("No"); return 0; } } puts("Yes"); return 0; }