如果您正在開發軟件來解決魔方問題,您會如何表示魔方?你會如何在代碼中代表魔方?
回答
有很多方法可以做到這一點。有些方法比其他方法更有效地利用內存。
我已經看到人們使用長方體對象的3 x 3 x 3數組,其中立方體對象需要存儲顏色信息(是的,該中心對象從不使用)。我看到有人使用6個數組,每個數組都是一個3 x 3的長方體數組。我看過一個3 x 18的立方體陣列。有很多可能性。
可能更大的擔心是如何表示各種變換。旋轉物理立方體的單個面(所有立方體移動基本上是單個面的旋轉)必須通過交換大量立方體對象來表示。
你的選擇應該是對你正在編寫的任何應用程序有意義的選擇。這可能是因爲你只渲染了多維數據集。可能沒有用戶界面。你可能正在解決魔方。
我會選擇3 x 18陣列。
一種方法是專注於視覺外觀。
立方體有六個面,每個面是一個三乘三的正方形陣列。所以
Color[][][] rubik = new Color[6][3][3];
然後每一個動作是一種方法,一個特定的一組彩色方塊置換。
這是我用過的方式。使旋轉面很容易。 `new_cube [face] [i] [j] =順時針? old_cube [j] [2 - i]:old_cube [2 - j] [i]; }` – azz 2013-02-05 12:08:39
您可以將立方體想象爲三個垂直的圓形鏈表,它們與三個水平鏈表相交。
只要旋轉某個立方體的某一行,就可以旋轉相應的指針。
它應該是這樣的:
struct cubeLinkedListNode {
cubedLinkedListNode* nextVertical;
cubedLinkedListNode* lastVertical;
cubedLinkedListNode* nextHorizontal;
cubedLinkedListNode* lastHorizontal;
enum color;
}
您可能沒有實際需要的2「last'三分球。
[我是用C做的,但是可以用Java或C#完成,只需使用一個簡單的類爲cubeLinkedListNode,每個類都持有對其他節點的引用。 ]
請記住,有六個互鎖的循環鏈表。 3垂直3水平。
對於每次旋轉,您只需在相應的循環鏈表中順序移動旋轉圓的鏈接以及連接圓即可。
類似的東西,至少...
有20個重要的小方塊。所以一種做法是以20個字符串組成的數組。字符串可以包含2或3個字符來指示顏色。任何一次移動都會影響7個立方體。所以你只需要在六方中的每一方都有一個重映射器。
注意:此解決方案無法記住白色中心上的徽標貼紙的方向。順便說一句,我曾幫助某人在15年前做過一次軟件魔方,但我不記得我們是如何表現它的。
這個ACM Paper描述了幾種替代方式,它用來表示魔方,並將它們與其他魔方進行比較。可悲的是,我沒有一個帳戶來獲取全文,但描述如下:
提出並比較了魔方的七個替代表示方法:一個3乘3乘3的3-數字整數;一個6×3×3的文字列;一個5乘12的文字矩陣;一個ll-ll-ll稀疏文字矩陣;一個54個元素的向量;一個4維數組;和一個3×3×3的嵌套數組。 APL功能用於定向移動和四分之一轉加上幾個有用的工具來解決立方體。
另外,這個RubiksCube.java文件包含一個非常乾淨的表示以及用於旋轉部分的相關代碼(如果您正在查找實際代碼)。它使用單元格和麪陣列。
其他很好地描述了物理立方體,但關於立方體的狀態...我會嘗試使用矢量變換的數組來描述立方體的變化。這樣,您就可以隨着更改而保留rubiks立方體的歷史。我想知道是否可以將矢量乘以轉換矩陣來找到最簡單的解決方案?
作爲可以移動的48個面的排列組合。基本的旋轉也是排列組合,排列可以組成,它們組成一個組。
在一個程序中,這樣的置換可以用包含數字0到47的48個元素的數組來表示。對應於這些數字的顏色是固定的,所以可以從置換中計算視覺表示,反之亦然。
「Cube Explorer」軟件使用一種有趣的方法來表示多維數據集。使用很多聰明的數學方法可以用5個整數表示立方體。作者在他的website上解釋了他的計劃背後的數學。根據作者,該表示適合於實現快速解算器。
逃避優化;使其面向對象。我用了一個僞類輪廓是:
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
的使用的內存量是如此之小,處理,最小的最優化是完全不必要的,尤其是當你犧牲代碼的可用性。
- 1. 你會如何做這個PHP代碼?
- 2. 你會如何重構這段代碼?
- 3. 你會如何改善這段代碼?
- 4. 你會如何重構這段代碼?
- 5. 你會如何在PHP中進行代碼轉義?
- 6. 你會如何用代碼片段替換設計表單?
- 7. 你會如何改進這個表單驗證代碼?
- 8. 你會如何構造,或者在PHP中構造代碼的最佳方式?
- 9. 你如何組織你的Javascript代碼?
- 10. 你如何組織你的代碼?
- 11. 你如何修改你的代碼?
- 12. 你如何構建你的jQuery代碼?
- 13. 你如何將JavaScript代碼和html代碼結合在一起?
- 14. 你如何在TASM代碼減法
- 15. 你如何在visual studio中預覽你的C++代碼
- 16. 你會如何結合這個WordPress的短代碼模板代碼?
- 17. 你會使用代碼氣泡嗎?
- 18. 你如何維護開發代碼和生產代碼?
- 19. 你如何顯示你的PHP源代碼高亮或查看源代碼?
- 20. 你如何從asp.net代碼中獲得複選框列表?
- 21. 如何表示魔方
- 22. 你如何從原生Android代碼
- 23. 你如何測試非功能代碼?
- 24. 你如何測試Java EE代碼?
- 25. 你如何使這段代碼更pythonic?
- 26. 你如何處理生成的代碼?
- 27. 你如何處理LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED錯誤代碼?
- 28. 你如何使代碼加入?
- 29. 你如何測試CocoaPod代碼?
- 30. 如何模仿你的代碼
這取決於您需要在數據上做什麼操作 – stefanB 2010-01-22 06:01:36