P6980
考虑如何判断一个二维图形是否能够折成一个正方体:随意选择一个底面放在
接下来考虑如何把上述做法推广到四维,假设我们放的超立方体个顶点和原点重合,其余的一些棱分别和四个坐标轴重合。记四个坐标轴分别为
维护垂直于
-
取的是
x 轴上远离原点的向内翻折,则以新立方体为底面的内侧在x 轴的反方向,但x 轴上新的离原点最近的立方体变成了原先离原点最远的立方体。 -
取的是
x 轴上靠近原点的向内翻折,则以新立方体为底面的内侧在x 轴的正方向,但w 轴也跟着转了,于是w 轴上新的离原点最近的立方体变成了原先离原点最远的立方体。 -
其他维同理。
不难写个 DFS 解决问题。
const int N = 10;
int m, n, k, v_cnt, p[N], vis[N];
char str[N][N][N];
void Dfs(int x, int y, int z, int a, int b, int c, int d) {
str[x][y][z] = '.';
++vis[d];
if(str[x + 1][y][z] == 'x') Dfs(x + 1, y, z, d ^ 1, b, c, a);
if(str[x - 1][y][z] == 'x') Dfs(x - 1, y, z, d, b, c, a ^ 1);
if(str[x][y + 1][z] == 'x') Dfs(x, y + 1, z, a, d ^ 1, c, b);
if(str[x][y - 1][z] == 'x') Dfs(x, y - 1, z, a, d, c, b ^ 1);
if(str[x][y][z + 1] == 'x') Dfs(x, y, z + 1, a, b, d ^ 1, c);
if(str[x][y][z - 1] == 'x') Dfs(x, y, z - 1, a, b, d, c ^ 1);
}
int main() {
rd(m, n, k);
for(int x = 1; x <= k; ++x)
for(int y = 1; y <= n; ++y)
scanf("%s", str[x][y] + 1);
for(int x = 1; x <= k; ++x)
for(int y = 1; y <= n; ++y)
for(int z = 1; z <= m; ++z)
if(str[x][y][z] == 'x') {
Dfs(x, y, z, 0, 2, 4, 6);
bool flag = true;
for(int i = 0; i < 8; ++i)
if(vis[i] != 1) {
flag = false;
break;
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}
return 0;
}