Sel*_*ron 2 algorithm haskell sudoku
我很难理解数独求解器的这一部分.我不知道扩展功能如何工作.
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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?简短的解释将非常有帮助.
幸运的是,您链接的代码很好地评论了.从上面引用功能:
函数展开的行为方式与折叠相同,只是它只折叠第一个具有多个选项的正方形:
直观地,该函数expand采用数独并找到仍可能有多个选择的第一个单元格.然后,它扩展了这个选择,产生了许多具有特定选择的sudokus.也就是说,它(大致)转向:
[ some data ... , [ data, ... [1,2,3] ... data ] , other data ]
Run Code Online (Sandbox Code Playgroud)
成
[[ some data ... , [ data, ... [1] ... data ] , other data ]
,[ some data ... , [ data, ... [2] ... data ] , other data ]
,[ some data ... , [ data, ... [3] ... data ] , other data ]]
Run Code Online (Sandbox Code Playgroud)
关键是这些:
(rows1,row:rows2) = break (any (not . single)) m
Run Code Online (Sandbox Code Playgroud)
这里row是第一行,其中有一个单元格具有非单一选择.rows1,rows2是数独的前/后行.
(row1,cs:row2) = break (not . single) row
Run Code Online (Sandbox Code Playgroud)
这cs是第一个row具有非单一选择的单元格.row1,row2是左/右部分row.