2015-01-13 46 views
2

我很難理解數獨解算器的一部分this。我不明白擴展函數的工作原理。在Haskell中展開數獨求解器的功能

expand    :: Matrix Choices -> [Matrix Choices] 
expand m    = 
    [rows1 ++ [row1 ++ [c] : row2] ++ rows2 | c <- cs] 
    where 
     (rows1,row:rows2) = break (any (not . single)) m 
     (row1,cs:row2) = break (not . single) row 

這裏會發生什麼?簡單的解釋會很有幫助。

回答

6

幸運的是,您鏈接的代碼很好地評論。從上面的函數引用:

功能拓展的行爲以同樣的方式崩潰,但 只與一個以上的選擇摺疊第一方陣:

直觀,功能expand需要一個數獨並找到第一個單元,其中還有可能有多個選擇。然後,它擴大了這個選擇,產生了許多具有特殊選擇的sudokus。也就是說,它接通(大約):

[ some data ... , [ data, ... [1,2,3] ... data ] , other data ] 

[[ some data ... , [ data, ... [1] ... data ] , other data ] 
,[ some data ... , [ data, ... [2] ... data ] , other data ] 
,[ some data ... , [ data, ... [3] ... data ] , other data ]] 

關鍵線路是這些:

(rows1,row:rows2) = break (any (not . single)) m 

這裏,row是第一行,其中有具有細胞一個非單一的選擇。 rows1,rows2是數獨之前/之後的行。

(row1,cs:row2) = break (not . single) row 

這裏,csrow具有非單一選擇所述第一小區。 row1,row2row中的左/右部分。

1

如果任何人想知道,

type Matrix a = [a] 
type Choices = [Value] 
type Value = Char 

這是

expand m = [rows ++ ... ++ rows 2 | c <- cs] 

其中...

[ row1 ++ ([c] : row2) ] 

的各種局部變量在where塊定義。換句話說,我們正在搜索輸入矩陣並將其分解爲一對結果。

如果你的問題是「這是什麼所有意味着?」,坦白地說,我不知道。這段代碼並不是我所說的「直觀」。