哈斯克尔:获得数独解算器块 [英] Haskell: Get block for Sudoku solver
问题描述
例如:
0 1 2 3 4 5 6 7 8
9 10 ...
我在尝试返回表示位置落入的3x3网格的Int列表。例如,对于网格(0,0)中的位置1,它将返回[0,1,2,9,10,11,18, 19,20]和位于网格(0,2)的位置8,它将返回[6,7,8,15,16,17,24,25,26]。
我写了一个函数,它返回所需的3x3网格,在一个9x9的Sudoku中:
getBlock :: Int - > Int - > [(Int]]
getBlock xy = [[((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(y * sudokuSizeSq + 0)*((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))],[((x * sudokuSizeSq + 1)* sudokuSize) ((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))] ((x * sudokuSizeSq + 2)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 2)* sudokuSize) +(y * sudokuSizeSq +(sudokuSizeSq-1))]]]
其中:
sudokuSizeSq是宽度的平方(3)
sudokuSize是宽度(9)
这有效,但是我想增加它,因此它可以适用于更大的网格。我改变了我的代码到后面,但它似乎不会加载函数。
getBlock :: Int - > Int - > [(Int]]
getBlock xy = [[((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(y * sudokuSizeSq + 0)*((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))],[((x * sudokuSizeSq + 1)* sudokuSize) ((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))] (x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq + 0) x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))]]
我这样做的方式似乎很麻烦,有没有更好的方法来做到这一点或解决我遇到的问题。谢谢。
[a + b
| a< - 取sudokuSizeSq $ map(sudokuSize *)[x * sudokuSizeSq ..]
,b< - 取sudokuSizeSq [y * sudokuSizeSq ..]]
I am trying to build a Sudoku solver for a project I am working on. I have a 9x9 grid with each position numbered 0..80, left to right, top to bottom
e.g.:
0 1 2 3 4 5 6 7 8
9 10 ...
I am trying to return a list of Int's that represent the 3x3 grid that a position falls in. For example for position 1, which is in grid (0,0) it would return [0,1,2,9,10,11,18,19,20] and for position 8, which is in grid (0,2) it would return [6,7,8,15,16,17,24,25,26].
I have written a function which returns the required 3x3 grid, on a 9x9 Sudoku:
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))]]
Where: sudokuSizeSq is the square of the width (3) sudokuSize is the width (9)
x and y represent the possible grids.
This works, however I would like to increase it so it will work for larger grids. I changed my code to the follow but it seems then wont load the function.
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))]]
The way I'm doing it seems very cumbersome, is there a better way to do this or a way to fix the problem I'm having. Thanks.
[ a + b
| a <- take sudokuSizeSq $ map (sudokuSize *) [x * sudokuSizeSq .. ]
, b <- take sudokuSizeSq [y * sudokuSizeSq ..] ]
这篇关于哈斯克尔:获得数独解算器块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!