重温三阶魔方

原文首发于微信公众号 Laird Notes,转载时排版略有调整。

春节回家时,翻出了十多年前的《魔方宝典》,纸张如今已泛黄。

三月初重新买了个魔方,才发现太久没玩,都已忘记还原的方法。

靠着尝试、搜索和回忆,慢慢找回感觉,也有些新发现。

又拖了一月,才勉强写下这篇备忘。


魔方基本概念

魔方(魔术方块)是匈牙利建筑学教授Rubik Ernő在1974年发明的智力玩具。

经典的三阶魔方有26个块:6个中心块、12个棱块、8个角块。

6个面一般记为:顶面U、底面D、前面F、背面B、左面L、右面R。

标准配色:白黄相对、红橙相对、蓝绿相对,UFR分别为黄蓝红。

3×3×3 Rubik’s Cube

转动公式中R表示右层顺时针旋转,R’表示逆时针、R2表示旋转180度,依此类推。


极简还原公式

层先法适合初学者,从下往上逐层还原,最少只需要记忆4个公式。

通过观察可以相对简单地还原底层和中层4个棱块,在此略过不表。

在前两层归位的基础上,应用以下公式来还原最顶层。然后完成啦~

  1. 顶层十字:F R U R’ U’ F’
  2. 交换棱块:R U R’ U R U2 R’
  3. 交换角块:R B’ R F2 R’ B R F2 R2
  4. 角块翻色:(R’ D’ R D) 重复操作

层先法熟练后,可以过渡到速拧常用的CFOP方法(119个公式)。

Cube Explorer 魔方求解软件

计算机算法

1992年Kociemba提出的Two-Phase算法,是计算机求解三阶魔方的主流方法。

该算法充分利用群论对称性和启发式搜索(IDA*),可以快速找到近似最优解。

2010年大规模计算证明:三阶魔方任意状态均可在20步(上帝之数)以内还原。

以下Python代码展示如何构建魔方状态,并调用库函数求解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import kociemba
import pycuber

cube = pycuber.Cube()
scramble = "F R U R' U' F' R U R' U R U2 R' R B' R F2 R' B R F2 R2 R' D' R D R' D' R D"
cube(scramble)

def cube_to_state(cube):
color_map = {'yellow':'U', 'orange':'R', 'green':'F', 'white':'D', 'red':'L', 'blue':'B'}
faces = ['U', 'R', 'F', 'D', 'L', 'B']
state = ''
for f in faces:
face = getattr(cube, f)
for row in face:
for square in row:
state += color_map[square.colour]
return state

cube_str = cube_to_state(cube)
solution = kociemba.solve(cube_str)
print(solution)
# F B2 L2 U B L2 D R U2 F R2 D B2 U F2 L2 D L2 D' F2

电影和现实

电影《当幸福来敲门》中,威尔·史密斯在出租车上拼好魔方,带来了珍贵的面试机会。

魔方从打乱到还原的过程,精准隐喻了主人公的人生从混乱失控到重建秩序的艰难历程。

Pursuit of Happyness 据说这是一部非常适合中年失业者的励志片。追寻幸福❤️

实习生教材《证券分析》

最后想问:你在几岁时第一次接触魔方?有没有见过机器人还原魔方?


参考资料

T. Rokicki, H. Kociemba, M. Davidson, J. Dethridge. The diameter of the Rubik’s Cube group is twenty. SIAM Journal on Discrete Mathematics, 2013, 27(2): 1082-1105.