三阶魔方:结构、记号与复原原理
三阶魔方是 1974 年匈牙利人鲁比克(Ernő Rubik)做出来的,原本是给建筑系学生讲三维结构的教具,后来成了全世界卖得最多的玩具。它只有 26 个小块、六个面,能摆出的状态却超过 4.3×10¹⁹ 种——四千三百亿亿。
这个数字大到没什么实感,但它恰恰是理解魔方的入口:状态多到不可能靠"试"来解,所以魔方一定存在某种结构上的规律,而复原原理讲的就是这个规律。魔方不难,难的是它不给你留多少能动的余地。
这篇记三件事:它由什么拼起来、转动怎么记、以及所有复原公式背后其实是同一个套路。中间嵌了一个能转的魔方,读到记号那节可以直接上手。
26 个小块,只分三类
拆过魔方的人都有印象:外面看着是 27 个小方块,其实只有 26 个——正中心那个位置是空的,被六根轴的十字撑着。这 26 块按"露在外面的颜色数"分成三类,各归各位,一辈子不会串:
| 类型 | 数量 | 贴纸 | 能去哪 |
|---|---|---|---|
| 中心块 | 6 | 1 张 | 钉在轴上,只原地自转,从不换位置 |
| 棱块 | 12 | 2 张 | 永远在棱上,只能在 12 条棱之间换 |
| 角块 | 8 | 3 张 | 永远在角上,只能在 8 个角之间换 |
这条约束是全部复原方法的地基:一个块长什么样,就决定了它能去哪。绿白棱块无论怎么转,都只可能在绿面和白面之间那条棱上,区别只是朝向对不对。所以复原不是"把 54 张贴纸一个个摆对",而是"给 20 个块各自找对位置、再摆正朝向"。
总数怎么算出来的:8 个角块有 8! 种排法、每个有 3 种朝向;12 个棱块有 12! 种排法、每个有 2 种朝向。乘起来再除掉那些"拆开才做得到"的情况(三个约束:角朝向和、棱朝向和、置换奇偶性),得到 8! × 3⁷ × 12! × 2¹⁰ ≈ 4.3×10¹⁹ 种。
顺带一个常被问的数字:上帝之数是 20。意思是任意一种打乱状态,都存在不超过 20 步的解法。这个结论 2010 年才被证明完,靠的是把状态分组后用了大约 35 CPU-年的算力穷举。20 步是理论下界,人类解法普遍在 50~100 步。
六个面与转动记号
魔方只有六个字母要记,全是英文首字母:U 上(Up)、D 下(Down)、L 左(Left)、R 右(Right)、F 前(Front)、B 后(Back)。
记号的规则只有三条:
- 单个字母 = 这一层从该面外侧看顺时针转 90°。比如
R是站在右边看进去、顺时针转右面一层。 - 带一撇 = 逆时针:
R'。带 2 = 转 180°:R2。 - 面是按中心块认的,不是按你眼前看到的那一面。把魔方转个方向看,原来的右面跑到眼前了,它还是 R,不会变成 F。
第一条是新手最容易转反的地方,第三条是新手最容易搞混的地方。理解了第三条也就理解了为什么中心块重要——它是整个魔方里唯一不会挪窝的东西,六个面的"名字"就是它定义的。
记号讲完了,直接上手转两下最直观。下面这个魔方:拖动能换视角,下面两排按钮转的是魔方自己的层,转乱了点「复原」会一步一步倒着转回去。
用鼠标或手指拖着魔方能转视角;下面那两排按钮转的是魔方自己的层。
U 上(白) D 下(黄) L 左(橙) R 右(红) F 前(绿) B 后(蓝)
步数 0 · 最近 —
当前状态(展开图,跟着转)
按钮分两类,别弄混:转一层动的是魔方,状态真的变了,展开图和步数跟着走;转视角只动镜头,魔方一个格子都没变。三个示例里,① 是 R U R' U' 连做六次(下一节会讲为什么正好六次),② 是复原顶层朝向用的小鱼公式,③ 每次随机。
复原到底在做什么
先把真正的矛盾摆出来:你每转一步,都会打乱已经做好的部分。底层十字刚拼好,一转 R 就散了。所以复原的要害根本不是"把某个块挪过去"——挪过去谁都会,难的是挪过去的同时其余 20 个块一个都不动。
于是复原方法的思路就只剩一条:找一个只影响你想动的那几块、其余一律不动的动作序列。而所有这类序列的构造方式,都是下一节那个套路。
主流入门方法叫层先法,一层一层往上收,七步走完:
| 步 | 做什么 | 此时还剩多少块没定 |
|---|---|---|
| 1 | 底层十字(四个棱块围住底中心) | 还需要 4 角 + 4 中棱 + 顶层 8 块 |
| 2 | 底层四个角归位 | 中棱 4 + 顶层 8 |
| 3 | 中层四个棱归位 | 顶层 8 |
| 4 | 顶层十字(只看朝向,不看位置) | 顶层 8(4 棱已定色) |
| 5 | 顶面全部朝上(OLL) | 顶层 8(颜色全对,位置待定) |
| 6 | 顶角归位 | 顶棱 4 |
| 7 | 顶棱归位(PLL) | 0 |
看这张表的关键不在背步骤,而在看自由度是怎么一步步被吃掉的:做完前两步,底层就"锁死"了,后面每一步都只能用不碰底层的公式;做到第 5 步,剩下的就只是"顶层八个块怎么摆",于是完全可以靠查表——顶层朝向 57 种情况、顶层位置 21 种情况,各背一条公式即可。
步数上:层先法一般 100 步以上;速拧主流的 CFOP(十字 + 前两层一起做 + OLL + PLL)能压到 55~60 步,代价是 OLL 57 条、PLL 21 条公式要背熟。方法之间的差异主要是"每一步允许自己动多少块",不是原理不同——原理是同一个。
公式的本质:做一遍,再撤一遍
这一节是整篇的核心。所有复原公式,从入门的三棱换到速拧用的 57 条 OLL,本质上都是同一个结构:
做一组动作 A,做一组动作 B,把 A 原样撤销,把 B 原样撤销——A B A' B'。
为什么这样能"只动少数块"?直觉很简单:被 A 碰过、但没被 B 碰到的那些块,在"做 A + 撤 A"里已经抵消了;被 B 碰过、没被 A 碰到的同理。只有同时被 A 和 B 影响到的那几块,才会留下净变化。数学上这叫交换子(commutator),魔方圈里的人不一定这么叫,但用的全是它。
页面上那个「① 上上下下 ×6」就是现成的例子:R U R' U' 正好是 A=R、B=U 的交换子。它只影响 R 面和 U 面交界处的那几个块,其余纹丝不动。反复做下去不会越转越乱,而是进入一个长度为 6 的循环——连做六次,魔方精确回到原状。这就是"上上下下"在魔方圈里被叫做 sexy move、又被当成万能过渡动作的原因:它破坏得少、还能自己绕回来。
从这个结构能直接推出三条实用的东西:
- 公式可以推,不必死背。理解了"做一遍再撤一遍",自己也能凑出能用的序列,只是凑出来的通常比背的长。
- 任何公式都能反着用。把序列倒过来、每一步都取逆,得到的就是它的逆操作。转错了不用从头来,倒着转回去就行——页面上的「复原」按钮干的就是这件事。
- 背公式是为了快,不是因为不会推。速拧选手背的是"别人已经验证过最短的那条",省的是思考时间。
还有个结构值得知道:共轭 X Y X'。意思是"先摆个姿势 X,做完动作 Y,再把姿势撤掉"。魔方里大量公式是"交换子套共轭"——先用共轭把要处理的块挪到方便的位置,做完交换子,再原路退回去。理解了这两条,看任何一条长公式都能拆出结构,不再是一串要硬记的字母。
反过来也解释了为什么魔方"很难":4.3×10¹⁹ 种状态,人脑不可能搜索,只能靠这类结构把问题切成若干个小问题。所谓学会复原,就是学会这套切法。
页面这个魔方是怎么搭的
不是贴图假装立体,是真的 CSS 3D:transform-style: preserve-3d 加上 27 个小块(正中心那块省了,反正看不见),每块六个面——露在外面的贴彩色贴纸,朝里的全是黑塑料。所以从哪个角度看都是个实心方块,不会看穿。
状态只记两样东西:位置 [x,y,z](每根轴 -1 / 0 / 1)和朝向(一个 3×3 整数矩阵)。转一层就是这两个都左乘一个 90° 旋转矩阵。因为矩阵里全是整数,转一万次也不会歪半个像素——比用欧拉角累加省事太多。
动画这里有个坑值得记一笔:不能直接给小块的 transform 加过渡。CSS 插值是平移和旋转分开算的,角块会走直线而不是绕轴划弧,看着像穿模。做法是先建一个位于魔方中心的空容器,把要转的那 9 块临时挪进去,让容器绕轴转 90°,转完再把旋转量烘回每个小块自己的矩阵上,容器删掉。视觉上是整层一起绕轴转,状态上还是整数矩阵,两头都不亏。
展开图是反算出来的,没有第二份状态:对每个格位,找出现在占了它的小块,再看这个小块哪张贴纸正朝着外面,取那张贴纸的颜色。所以展开图和 3D 不可能对不上——它们是同一份数据的两种看法。
它不是求解器:页面上的「复原」只是把你做过的每一步倒着放一遍,不会解一个打乱的魔方。要真解,得用上一节的层先法或 CFOP。
留着的坑
- 拖动只绕竖轴和横轴,不是真正的任意姿态(trackball)。够用,但转不出斜着看的那种刁钻角度。
- 竖向视角卡在 ±90°:转过顶之后左右会反过来,索性不让过。
- 拖到极端角度时魔方的投影会变大(体对角线立起来 + 透视近大远小),舞台高度是按最大投影留的,偶尔还是会伸出去一点,所以下方内容都垫了层级,不会被盖住。
- 没有中层转(M / E / S)和整体转(x / y / z),标准公式里偶尔用到,目前只能拆成两层各转一次。
- 贴纸颜色写死,没跟着深色模式调——魔方本来就该是这个颜色,改了反而认不出面。
- 刷新即回到初始状态,没有本地存档。要的就是这个:一个点开就能玩、关掉不占东西的东西。