如何表示魔方

4

我想知道如何在Mathematica中设计魔方。这是否可能,我们该如何开始。我们如何决定魔方的6个面上小方块的不同间隔。


3
http://demonstrations.wolfram.com/RubiksCube/ - Dr. belisarius
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 /@ {...}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接