我正在尝试为我正在进行的项目构建一个数独求解器。我有一个9x9网格,每个位置编号为0..80,从左到右,从上到下
e.g:
0 1 2 3 4 5 6 7 8
9 10 ...
我试图返回一个Int列表,它代表一个位置所在的3x3网格。例如,对于位置1,它在网格(0,0)中,它将返回[0,1,2,9, 10,11,18,19,20]和8号位,在网格(0,2)中它将返回[6,7,8,15,16,17,24,25,26]。
我编写了一个函数,在9x9 Sudoku上返回所需的3x3网格:
getBlock :: Int -> Int -> [[Int]]
getBlock x y = [[((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]]
其中: sudokuSizeSq是宽度的平方(3) sudokuSize是宽度(9)
x和y代表可能的网格。
这是有效的,但我想增加它,因此它适用于更大的网格。我将代码更改为以下内容,但似乎不会加载该函数。
getBlock :: Int -> Int -> [[Int]]
getBlock x y = [[((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]..[((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]]
我这样做的方式看起来非常麻烦,是否有更好的方法来解决我遇到的问题。谢谢。
答案 0 :(得分:2)
[ a + b
| a <- take sudokuSizeSq $ map (sudokuSize *) [x * sudokuSizeSq .. ]
, b <- take sudokuSizeSq [y * sudokuSizeSq ..] ]
答案 1 :(得分:0)
您可以遍历每个块中的x / y偏移量以生成其中的所有位置。列表理解使这很容易:
getBlock :: Int -> Int -> [[Int]]
getBlock x y = [[(y*sudokuSizeSq+dy)*sudokuSize + x*sudokuSizeSq+dx | dx <- offsets]
| dy <- offsets]
where offsets = [0..sudokuSizeSq-1]