2011-01-17 1 views
1

나는 스도쿠 솔버를 코딩하려고하는데, 그렇게하려고 한 방법은 솔루션이나 유효한 값을 가질 수있는 "set"객체의 주소를 저장하는 9x9 격자의 포인터를 갖는 것이 었습니다.9x9 2 차원 어레이를 9 개의 서브 그리드 (스도쿠처럼)로 나누는가? (C++)

루프를 2 개 사용하고 각 열을 먼저 통과 한 다음 다음 행으로 이동하여 반복 할 수있었습니다.

그러나 특정 셀이 속하는 하위 격자 (또는 상자, 블록 등)를 지정하는 방법을 상상하기가 힘듭니다. 내 첫 인상은 for 문에 if 문이있는 것처럼 행이 < (행이 0으로 시작) & col < 2 인 경우 1 차 블록에 있지만 너무 복잡해 보인다. 이 일을하는 더 좋은 방법이 있을까요?

+2

(i, j)가 셀의 좌표이면, (i/3, j/3)은 블록의 좌표입니다. – ybungalobill

+0

sodoku solver의 경우 속도에 대해 조금 생각하고 미리 계산 된 조회 테이블을 사용하는 것이 좋습니다. 셀이 어느 블록에 있는지 조회하는 81 개 항목의 배열은 빠르고 간단합니다. 아직 그 배열을 생성해야하기 때문에 답이 아닙니다. 충분히 참을성이 있다면 수동으로 정적 데이터 블록으로 채울 수 있습니다. – Steve314

+1

@ Steve314 속도를 고려할 때 조회를 통한 간단한 계산을 선호하십시오. 전체 메모리 읽기는 비용이 많이 듭니다. 대답이 L1 캐시에있을 때만 그것을 찾는 것이 느려지지 않을 수 있습니다 (하지만 여전히 가치있는 L1 캐시 공간을 먹고 있습니다). – Sjoerd

답변

7

이 같은 행과 열에서 블록 수를 계산 수 :

int block = (row/3)*3 + (col/3); 

이 숫자 블록을 다음과 같이 :

+---+---+---+ 
| 0 | 1 | 2 | 
+---+---+---+ 
| 3 | 4 | 5 | 
+---+---+---+ 
| 6 | 7 | 8 | 
+---+---+---+ 
+0

나는 같은 대답을 올리려고했다. – Sjoerd

+0

이것은 내가 염두에 두었던 것입니다, 감사합니다! – kevin

0

내가 81 개 져야 할 엔트리로 조회 테이블을 만들 것입니다. 각 항목은 9x9 표의 셀을 참조하고 필요한 정보를 제공합니다 (어떤 상자, 어떤 열, 어떤 행 ...)

0

저는 이것을 직접 사용합니다 (그러나 파이썬에서는 x와 y가 있다고 가정합니다. 0에서 9까지 제외) :

int bx, by; 
for (bx = (x/3)*3; bx < (x/3)*3 + 3; bx++) { 
    for (by = (y/3)*3; by < (y/3)*3 + 3; by++) { 
     // bx and by will now loop over each number in the block which also contains x, y 
    } 
}