[恢复状态] 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;
}
评论 (0)