2015-01-13 17 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块定义。换句话说,我们正在搜索输入矩阵并将其分解为一对结果。

如果你的问题是“这是什么所有意味着?”,坦白地说,我不知道。这段代码并不是我所说的“直观”。