扩展Haskell中数独求解器的功能

时间:2015-01-13 12:13:22

标签: algorithm haskell sudoku

我很难理解数独求解器this部分的一部分。我不知道扩展功能如何工作。

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

这里发生了什么?简短的解释将非常有用。

2 个答案:

答案 0 :(得分: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

此处,cs是具有非单一选择的row的第一个单元格。 row1,row2row中的左/右部分。

答案 1 :(得分:1)

如果有人想知道,

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

这是

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

其中...

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

各种局部变量在where块中定义。换句话说,我们正在搜索输入矩阵并将其分解为一对结果。

如果您的问题是“这一切意味着什么?”,那么坦率地说,我不知道。这段代码不是我所说的“直观”。