2011-01-31 48 views
1

我正在嘗試爲我正在處理的項目構建一個Sudoku求解器。我有編號0..80每個位置,從左至右,從上到下Haskell:爲Sudoku解算器獲取塊

9x9的網格例如:

9 10 ...

我試圖返回廉政局的代表,一個位置落在3×3格的列表。例如,對於位置1,這是網格(0,0),它將返回[0,1,2,9, 10,11,18,19,20]和位於網格(0,2)的位置8將返回[6,7,8,15,16,17,24,25,26]。

我已經寫它返回所需要的3×3的網格,在9x9的數獨的函數:

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))]] 

我做它的方式似乎很麻煩,有沒有更好的辦法做到這一點還是有辦法來解決我遇到的問題。謝謝。

回答

2
[ a + b 
| a <- take sudokuSizeSq $ map (sudokuSize *) [x * sudokuSizeSq .. ] 
, b <- take sudokuSizeSq [y * sudokuSizeSq ..] ] 
+0

這幾乎給出了正確的結果。然而,我做x爲1,y爲0,它返回[9,10,11,18,19,20,27,28,29],因爲它應該返回[27,28,29,36,37, 38,45,46,47] – Joseph 2011-01-31 15:07:24

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]