4

我想知道我们如何在mathematica 中设计一个rubics 立方体。是否可能以及我们如何使用它。我们如何决定立方体 6 个面上较小立方体的不同分隔。

4

1 回答 1

6

您在问如何定义数据结构。只要您定义的操作正常工作,您的选择是任意的。例如,您可以表示如下立方体:

newCube[] := {
    {red, red, red, red, red, red, red, red, red},
    {orange, orange, orange, orange, orange, orange, orange, orange, orange},
    {yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow},
    {green, green, green, green, green, green, green, green, green},
    {indigo, indigo, indigo, indigo, indigo, indigo, indigo, indigo, indigo},
    {purple, purple, purple, purple, purple, purple, purple, purple, purple}
}

然后您可以定义一个扭曲(和可选的反扭曲)操作,每次移动一个(3 轴,每轴 3 层扭曲,2 个方向扭曲;或者 6 轴,每轴 3 层扭曲),或两个旋转操作和扭曲,并假设您可以组合这些操作以生成类似inverseRotate[simpleTwist[rotate[cube], ...], ...].

要找出你需要的代码,你必须有一个从你的表示到真实对象的映射。也许最好举一个硬币的例子,要么是正面,要么是反面:

newCoin[] := {heads}

flipCoin[coin_] := {If[coin[[0]]==heads, tails, heads]}

如果使用基本数据结构(如列表)表示对象并不容易,这可能会更加复杂。你甚至可以用如下矩阵来表示你的立方体:

newCube[] := {
    /red, red, red\  /orange, orange, orange\
    |red, red, red|  |orange, orange, orange|
    \red, red, red/, \orange, orange, orange/, ...
}

但是矩阵拼接在一起的方式不容易表示出来。所以它们在列表中的排序是任意的。

如果您仍然感到困惑,您可以这样做:

给你的表示中的每个插槽一个任意数字(最坏的情况,你将它们标记为 0 到 53,但你可以更优雅地处理它)。然后用一个真正的魔方,在每张脸上写下这些数字。然后当你做一个手术时,写下他们的新位置。这称为特定允许的移动/扭曲在您的半群数据结构上引起的排列。如前所述,其中有很多(18),您必须将它们全部写下来。然后你可以有类似的东西:

newCube[] := {0,1,2, 3,4,5, 6,7,8, ...53}

permutations = {
    {12,15,0, 3,4,5, 6,7,8, ...},  (*figure these out yourself*)
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . },
    {. . . }
}

twistCube[cube_, moveNumber_] := Permute[
    cube, 
    FindPermutation[permutations[[moveNumber]]]
]

您可以使用计算机科学技巧来优化它,而不是每次都调用 FindPermutation,使permutations = FindPermutation /@ {...}

于 2012-03-18T21:03:35.593 回答