2017-09-20 41 views
0

這是我的問題。我想創建一個算法,爲n維井字棋板生成每個可能獲勝棋盤狀態的數組陣列。假設你有一個N = 2板,這意味着2×2,那麼函數應該返回下面的數組:尋找所有獲勝的井字棋牌局的集合

wins = [ 
    [1,2], 
    [1,3], 
    [1,4], 
    [2,4] 
] 

我知道這是不是專門MATLAB的問題,但是我想擴大我的理解怎麼樣MATLAB工作。我的一般想法是執行以下操作的算法:

generate an n-dimensional board of zeros 
1. Go to the first cell, record that index ([1,]) 
2. Go to the end of the row, and that's your first board state ([1,2]) 
3. Go to the end of the column, that's your second board state ([1,3]) 
4. Go to the end of the diagonal, that's your third board state ([2,3]) 
5. Advance to the next cell, repeat, checking if you have already created that board state first ([2,4] should be the only one it hasn't done) 

我認爲我是在過度解決問題,但我不確定如何處理它。有人能給我一些指導如何以MATLAB-y的方式做到這一點?我的猜測是遍歷矩陣,只是選擇整行/列/對角線很容易,它是'檢查它是否存在'的一部分,我沒有得到。一般來說,你會如何稱這種算法?謝謝你的幫助!

回答

0

更好的主意:你不這樣做廣場,你做這個維度。在這塊板子上的每個維度,你有這些可能性的座標,通過獲勝組合改變或不:

  • 迭代通過所有可能的值,從低到高
  • 迭代通過所有可能的值,高低
  • 保持不變,因爲其他維度迭代,但對範圍中的每個值都這樣做,對其他座標重複。

例如,對於一個4^3板,讓我們看看最後一個座標(稱它們爲x1,x2,x3),x3。假設你已經確定X1將遍歷從低到高,X2恆定在2.你現在對待X3:

  • 迭代通過所有可能的值,從低到高
    • (1 ,2,1),(2,2,2),(3,2,3)
  • 迭代通過所有可能的值,高到低
    • (1,2,3), (2,2,2),(3,2,1)
  • 保持不變,因爲其他維度迭代,但對範圍中的每個值都這樣做,對其他座標重複。
    • (1,2,1),(2,2,1),(3,2,1)
    • (1,2,2),(2,2,2),(3, 2,2)
    • (1,2,3),(2,2,3),(3,2,3)

這是否讓你感動?