2011-01-31 2 views
1

나는 작업중인 프로젝트를위한 스도쿠 (Sudoku) 솔버를 만들기 위해 노력 중이다. I 하단하스켈 : 스도쿠 (Sudoku) 솔버 블록 받기

각각 왼쪽에서 오른쪽으로 번호가 위치 0..80, 상부와 9x9의 눈금이 예 :

0 1 2 3 4 5 6 7 8

9 10 ...

위치가 속하는 3x3 격자를 나타내는 Int 목록을 반환하려고합니다. 예를 들어 격자 (0,0)에있는 위치 1의 경우 [0,1,2,9, 1011181920]이고 위치 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)

입니다 폭의 정사각형 나는 9 × 9 스도쿠에 필요한 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))]] 

내가하고 있어요 방법은이 작업을 수행 할 수있는 더 좋은 방법이나 내가 데 문제를 해결하는 방법이 매우 복잡 보인다. 감사. 당신은 각 블록의 X/Y 오프셋을 통해 걸을 수

답변

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

거의 정확한 결과를 제공합니다. 그러나 나는 x를 1로, y를 0으로하고, [9,1011181920,27,28,29]를 반환합니다. [27,28,29,36,37, 38,45,46,47] – Joseph

+0

@ 조셉 : 그래, 내 부분에 오타. 거의? 어떤 부분이 꺼져 있는지 궁금해. – ephemient

+0

미안 - 내가 그것을 끝내기 전에 입력을 누른 내 의견을 제출 - 위의 편집했습니다. – Joseph

0

은 모든 위치를 생성합니다. 목록 이해는 다소 편하게 만듭니다.

getBlock :: Int -> Int -> [[Int]] 
getBlock x y = [[(y*sudokuSizeSq+dy)*sudokuSize + x*sudokuSizeSq+dx | dx <- offsets] 
       | dy <- offsets] 
    where offsets = [0..sudokuSizeSq-1]