2011-01-31 14 views
1

私が取り組んでいるプロジェクトのSudokuソルバーを構築しようとしています。 Iは、0..80の番号左から右へ、下Haskell:Sudokuソルバーのブロックを取得

例えばへ戻る各位置に9x9のグリッドを有する:

9 10 ...

位置が入っている3x3グリッドを表すIntのリストを返そうとしています。たとえば、グリッド(0,0)の位置1の場合、[0,1,2,9、 10,11,18,19,20]、位置8ではグリッド(0,2)にあり、[6,7,8,15,16,17,24,25,26]を返します。

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)

幅の正方形であるIは9x9の数独に、必要な3×3のグリッドを返す関数を作成した

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

+0

@Joseph:ええ、私の部分にタイプミス。ほぼ?どの部分がオフになっているのか不思議です。 – ephemient

+0

申し訳ありませんが、私がそれを完成する前に私のコメントを投稿しました。私は上にそれを編集しました。 – Joseph

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] 
関連する問題