我是Erlang的新手并尝试制作数独求解器。到目前为止,我可以输入一个由81个整数(9x9)组成的列表,如下所示
sudoku() -> [6,7,1,8,2,3,4,9,5,5,4,9,1,7,6,3,2,8,3,2,8,5,4,9,1,6,7,1,3,2,6,5,7,8,4,9,9,8,6,4,1,2,5,7,3,4,5,7,3,9,8,6,1,2,8,9,3,2,6,4,7,5,1,7,1,4,9,3,5,2,8,6,2,6,5,7,8,1,9,3,4].
我根据list splitting algorithm by stemm分割成行:
split_rows(sudoku()).
返回:
[5,4,9,1,7,6,3,2,8],
[3,2,8,5,4,9,1,6,7],
[1,3,2,6,5,7,8,4,9],
[9,8,6,4,1,2,5,7,3],
[4,5,7,3,9,8,6,1,2],
[8,9,3,2,6,4,7,5,1],
[7,1,4,9,3,5,2,8,6],
[2,6,5,7,8,1,9,3,4]]
要获取列,我只需使用elegant solution of mpm转置此矩阵。
下一步是收集九个方框的列表。然后我可以检查这些列表中是否有重复的元素,以查看解决方案是否有效。
不幸的是,我不清楚如何获得正方形,例如,
[[1],[2],[3],
[4],[5],[6],
[7],[8],[9]]
其中每个方块代表块中的九个数字。在这种情况下,正方形看起来像这样:
[5,4,9,
3,2,8,
1,2,2]
有谁知道如何做到这一点?
答案 0 :(得分:2)
您可以使用lists:sublist/3
:
square(X, Y, Side, Board) ->
Rows = lists:sublist(Board, (Y-1)*Side + 1, Side),
[lists:sublist(Row, (X-1)*Side + 1, Side) || Row <- Rows].
它将返回列表列表
1> Board =
[[6,7,1,8,2,3,4,9,5],
[5,4,9,1,7,6,3,2,8],
[3,2,8,5,4,9,1,6,7],
[1,3,2,6,5,7,8,4,9],
[9,8,6,4,1,2,5,7,3],
[4,5,7,3,9,8,6,1,2],
[8,9,3,2,6,4,7,5,1],
[7,1,4,9,3,5,2,8,6],
[2,6,5,7,8,1,9,3,4]].
4> so:square(1,1,3,Board).
[[6,7,1],
[5,4,9],
[3,2,8]]
5> so:square(3,3,3,Board).
[[7,5,1],
[2,8,6],
[9,3,4]]
6> so:square(2,2,3,Board).
[[6,5,7],
[4,1,2],
[3,9,8]]
7> so:square(3,2,3,Board).
[[8,4,9],
[5,7,3],
[6,1,2]]
如果您只想要一个列表(平面列表),请square/4
使用lists:flatten/1
。