2009-02-01 19 views

回答

4

有很多方法可以做到這一點。有些方法比其他方法更有效地利用內存。

我已經看到人們使用長方體對象的3 x 3 x 3數組,其中立方體對象需要存儲顏色信息(是的,該中心對象從不使用)。我看到有人使用6個數組,每個數組都是一個3 x 3的長方體數組。我看過一個3 x 18的立方體陣列。有很多可能性。

可能更大的擔心是如何表示各種變換。旋轉物理立方體的單個面(所有立方體移動基本上是單個面的旋轉)必須通過交換大量立方體對象來表示。

你的選擇應該是對你正在編寫的任何應用程序有意義的選擇。這可能是因爲你只渲染了多維數據集。可能沒有用戶界面。你可能正在解決魔方。

我會選擇3 x 18陣列。

9

一種方法是專注於視覺外觀。

立方體有六個面,每個面是一個三乘三的正方形陣列。所以

Color[][][] rubik = new Color[6][3][3]; 

然後每一個動作是一種方法,一個特定的一組彩色方塊置換。

+0

這是我用過的方式。使旋轉面很容易。 `new_cube [face] [i] [j] =順時針? old_cube [j] [2 - i]:old_cube [2 - j] [i]; }` – azz 2013-02-05 12:08:39

1

您可以將立方體想象爲三個垂直的圓形鏈表,它們與三個水平鏈表相交。

只要旋轉某個立方體的某一行,就可以旋轉相應的指針。

它應該是這樣的:

struct cubeLinkedListNode { 
    cubedLinkedListNode* nextVertical; 
    cubedLinkedListNode* lastVertical; 
    cubedLinkedListNode* nextHorizontal; 
    cubedLinkedListNode* lastHorizontal; 
    enum color; 
} 

您可能沒有實際需要的2「last'三分球。

[我是用C做的,但是可以用Java或C#完成,只需使用一個簡單的類爲cubeLinkedListNode,每個類都持有對其他節點的引用。 ]

請記住,有六個互鎖的循環鏈表。 3垂直3水平。

對於每次旋轉,您只需在相應的循環鏈表中順序移動旋轉圓的鏈接以及連接圓即可。

類似的東西,至少...

4

有20個重要的小方塊。所以一種做法是以20個字符串組成的數組。字符串可以包含2或3個字符來指示顏色。任何一次移動都會影響7個立方體。所以你只需要在六方中的每一方都有一個重映射器。

注意:此解決方案無法記住白色中心上的徽標貼紙的方向。順便說一句,我曾幫助某人在15年前做過一次軟件魔方,但我不記得我們是如何表現它的。

20

這個ACM Paper描述了幾種替代方式,它用來表示魔方,並將它們與其他魔方進行比較。可悲的是,我沒有一個帳戶來獲取全文,但描述如下:

提出並比較了魔方的七個替代表示方法:一個3乘3乘3的3-數字整數;一個6×3×3的文字列;一個5乘12的文字矩陣;一個ll-ll-ll稀疏文字矩陣;一個54個元素的向量;一個4維數組;和一個3×3×3的嵌套數組。 APL功能用於定向移動和四分之一轉加上幾個有用的工具來解決立方體。

另外,這個RubiksCube.java文件包含一個非常乾淨的表示以及用於旋轉部分的相關代碼(如果您正在查找實際代碼)。它使用單元格和麪陣列。

+2

任何能夠爲我們下載該PDF並將其重新發布的ACM會員? – mmcdole 2009-02-01 05:39:30

+5

不知道這是否與版權內嵌... – ccook 2009-02-01 05:54:39

0

其他很好地描述了物理立方體,但關於立方體的狀態...我會嘗試使用矢量變換的數組來描述立方體的變化。這樣,您就可以隨着更改而保留rubiks立方體的歷史。我想知道是否可以將矢量乘以轉換矩陣來找到最簡單的解決方案?

0

作爲可以移動的48個面的排列組合。基本的旋轉也是排列組合,排列可以組成,它們組成一個組。

在一個程序中,這樣的置換可以用包含數字0到47的48個元素的數組來表示。對應於這些數字的顏色是固定的,所以可以從置換中計算視覺表示,反之亦然。

7

「Cube Explorer」軟件使用一種有趣的方法來表示多維數據集。使用很多聰明的數學方法可以用5個整數表示立方體。作者在他的website上解釋了他的計劃背後的數學。根據作者,該表示適合於實現快速解算器。

8

逃避優化;使其面向對象。我用了一個僞類輪廓是:

class Square 
    + name : string 
    + accronym : string 

class Row 
    + left_square : square 
    + center_square : square 
    + right_square : square 

class Face 
    + top_row : list of 3 square 
    + center_row : list of 3 square 
    + bottom_row : list of 3 square 

    + rotate(counter_clockwise : boolean) : nothing 

class Cube 
    + back_face : face 
    + left_face : face 
    + top_face : face 
    + right_face : face 
    + front_face : face 
    + bottom_face : face 

    - rotate_face(cube_face : face, counter_clockwise : boolean) : nothing 

的使用的內存量是如此之小,處理,最小的最優化是完全不必要的,尤其是當你犧牲代碼的可用性。