魔方加密

The Magic Cube Encryption

我正在尝试解决一个非常好的问题,我找到了解决方案,但这更像是静态解决方案。

问题。

立方体有 8 个角,每个角包含一个字符。例如,字符串 “ABCDEFGH”将在立方体上表示,如下图所示:

立方体可以上下左右旋转

这次向右旋转将初始字符串“ABCDEFGH”转换为 “BFGCAEHD”。

我想知道有什么算法或者公式可以找出角的变化吗?我确实通过记下角落的所有变化来解决它。例如,如果 A 在位置 1,那么如果您向右移动,它总是会用位置 5 的 E 替换它的位置。所以这是一个非常静态的解决方案。该解决方案之所以有效,是因为立方体旋转也是静态的并且从不改变位置。但是,想知道这是否可以用特定的算法来解决。谢谢:)

不确定我是否理解正确,但我认为您只需要写下每种情况的排列即可?比如,如果你考虑三种可能的 axes of rotation,顺时针和逆时针旋转方向,你就有六种可能的方式来旋转立方体。例如,在 Python 中,您可以这样做:

def permute(s, perm):
    return ''.join(s[i] for i in perm)

def rotate_frontback_cw(cube):
    return permute(cube, [1, 5, 6, 2, 0, 4, 7, 3])

def rotate_frontback_ccw(cube):
    return permute(cube, [4, 0, 3, 7, 5, 1, 2, 6])

def rotate_leftright_cw(cube):
    return permute(cube, [4, 5, 1, 0, 7, 6, 2, 3])

def rotate_leftright_ccw(cube):
    return permute(cube, [3, 2, 6, 7, 0, 1, 5, 4])

def rotate_updown_cw(cube):
    return permute(cube, [1, 2, 3, 0, 5, 6, 7, 4])

def rotate_updown_ccw(cube):
    return permute(cube, [3, 0, 1, 2, 7, 4, 5, 6])

def cube2str(cube):
    a, b, c, d, e, f, g, h = cube
    return (f'   {h}--------{g}\n'
            '  /|       /|\n'
            ' / |      / |\n'
            f'{e}--------{f}  |\n'
            f'|  {d}-----|--{c}\n'
            f'| /      | /\n'
            f'|/       |/\n'
            f'{a}--------{b}')

cube = 'ABCDEFGH'
print('cube')
print(cube2str(cube))
print('rotate_frontback_cw')
print(cube2str(rotate_frontback_cw(cube)))
print('rotate_frontback_ccw')
print(cube2str(rotate_frontback_ccw(cube)))
print('rotate_leftright_cw')
print(cube2str(rotate_leftright_cw(cube)))
print('rotate_leftright_ccw')
print(cube2str(rotate_leftright_ccw(cube)))
print('rotate_updown_cw')
print(cube2str(rotate_updown_cw(cube)))
print('rotate_updown_ccw')
print(cube2str(rotate_updown_ccw(cube)))

这将打印:

cube
   H--------G
  /|       /|
 / |      / |
E--------F  |
|  D-----|--C
| /      | /
|/       |/
A--------B
rotate_frontback_cw
   D--------H
  /|       /|
 / |      / |
A--------E  |
|  C-----|--G
| /      | /
|/       |/
B--------F
rotate_frontback_ccw
   G--------C
  /|       /|
 / |      / |
F--------B  |
|  H-----|--D
| /      | /
|/       |/
E--------A
rotate_leftright_cw
   D--------C
  /|       /|
 / |      / |
H--------G  |
|  A-----|--B
| /      | /
|/       |/
E--------F
rotate_leftright_ccw
   E--------F
  /|       /|
 / |      / |
A--------B  |
|  H-----|--G
| /      | /
|/       |/
D--------C
rotate_updown_cw
   E--------H
  /|       /|
 / |      / |
F--------G  |
|  A-----|--D
| /      | /
|/       |/
B--------C
rotate_updown_ccw
   G--------F
  /|       /|
 / |      / |
H--------E  |
|  C-----|--B
| /      | /
|/       |/
D--------A