魔方是一张图:用广度优先搜索找最短解

把魔方的每一种状态看成图上的一个节点,每一次转动看成一条边。二阶魔方(固定左下后角)一共 3,674,160 个节点,每个节点 9 条边。从“复原”出发跑一遍 BFS,整张图的每个节点就都知道自己离终点多远,之后任何打乱都能沿着“下坡边”走回来,而且步数一定最少。

二阶魔方 拖动旋转视角 · 键盘 U R F(Shift 反向)

当前节点编号
—
离复原的距离
—
BFS 已探索
0%
动画速度
左下后角(D·B·L 三色那块)当作参照不动,所以只需要 U、R、F 三个面的转动,其余转法都等价于它们加整体翻转。

你在图里的位置 每一列是一层 BFS(同一距离的所有节点)· 点邻居节点就沿那条边走

当前节点 下坡邻居(距离 −1) 同层邻居 上坡邻居(距离 +1) 最短路径

BFS 一层层展开 正在从复原状态出发探索整张图…

节点:一个状态 = 7 个可动角块的排列(7! = 5040 种)× 朝向(3⁶ = 729 种,第 7 块的朝向由前 6 块决定),合计 5040 × 729 = 3,674,160。每个状态被编成一个整数编号,整张图的“距离表”只占 3.6 MB。

边:U、R、F 各有顺时针、180°、逆时针三种转法,所以每个节点正好 9 条边。边是双向的(R 的反方向就是 R'),这是一张无向的 9-正则图,也就是魔方群的凯莱图。

求解:从复原节点做广度优先搜索,第 d 层就是“恰好需要 d 步”的全部状态。打开页面那一两秒,浏览器就在跑这件事。求解时站在当前节点,每次挑一条通向 d−1 层的边走,走 d 步必到终点,不可能更短。最远的一层是 11,这就是二阶魔方在这种计步方式下的“上帝之数”,那一层只有 2,644 个状态。

三阶呢?三阶有约 4.3×10¹⁹ 个节点,整张图存不下也搜不完。实际的求解器还是图论思路:Thistlethwaite / Kociemba 算法把大图按子群拆成几张能搜的小图分段走,或者用 IDA* 加模式数据库在图上做启发式搜索。三阶的上帝之数是 20。