4

我想知道我們如何才能在mathematica中設計一個rubics魔方。是否有可能以及如何配合。我們如何確定立方體6個面上的小立方體的不同分離。如何表示魔方

+3

http://demonstrations.wolfram.com/RubiksCube/ – 2012-03-19 03:07:14

回答

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)中有相當一部分(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 /@ {...}