스도쿠 규칙
스도쿠 게임에서는 9 × 9 = 81 셀로 구성된 고전적인 9- 케이지 그리드와 3 × 3 = 9 작은 9 개의 케이지 그리드를 형성합니다. 81 개의 작은 셀에서 숫자 1 ~ 9를 채워야하며 각 행, 열 및 각 작은 9 케이지 그리드에서 숫자를 반복 할 수 없습니다.
스도쿠 기술
내 생각
솔루션 설계 및 구현
스도쿠 체계를 저장하는 데 2 차원 배열 만 사용되며, 1 차원 어레이는 스택으로 사용되며 부울 변수는 백 트랙 식별으로 사용됩니다.
1. 변수 정의 :
var problem = [ //This is the question of difficulty 10.7 mentioned in the book [8,0,0,0,0,0,0,0,0], [0,0,3,6,0,0,0,0,0,0], [0,7,0,0,9,0,2,0,0], [0,5,0,0,0,7,0,0,0,0,0,0], [0,0,0,0,0,4,5,7,0,0,0], [0,0,0,1,0,0,0,0,3,0], [0,0,1,0,0,0,0,0,6,8], [0,0,8,5,0,0,0,0,1,0], [0,9,0,0,0,0,0,0,4,0,0,0]] var stack = [], flag = false;
2. 계획의 효과의 결정 :
JavaScript 객체의 해싱 기능이 완전히 사용됩니다. 디버깅을 용이하게하기 위해 함수의 반환 값은 유효 할 때 0이며, 유효하지 않은 경우 3 가지 상황이 있습니다 : 행 충돌, 열 충돌 및 9 부 그리드 충돌은 각각 1, 2 및 3입니다. 나는 초기 판단에서 그것을 사용했고 나중에 관련 25 프레임 판단을 추가했습니다. 이 기능은 답을 찾을 때 더 이상 사용되지 않습니다.
함수 checkValid (sudo) {lebsudo = {} // 보조 변수는 아홉 번째 그리드가 충돌하는지 여부를 결정하는 데 사용되었습니다 (i = 0; i <9; i ++) {let row = {}, col = {} // auxiliary 변수는 로우와 칼럼이 충돌하는지 여부를 결정하는 데 사용됩니다. sudo [i] [j], cur2 = sudo [j] [i] // (row [cur1]) // 현재 요소가 행에 나타나고 0의 판단이 최적화 된 경우 동시에 승인 된 변수 완료 행 및 열 판단. 키가 0이면 값은 0이므로 추가 판단이 필요하지 않습니다. 반환 1; // 반환 오류 코드 else row [cur1] = cur1 // 현재 요소가 행에 나타나지 않으며 (col [cur2]) if (col [cur2])에 보조 변수에 저장됩니다. 열의 판단은 행과 유사합니다. 0의 판단은 최적화되었습니다. 키가 0이면 값은 0이고 추가 판단이 필요하지 않습니다. 반환 2; else col [cur2] = cur2; key = math.floor (i/3)+'-'+math.floor (j/3) // 다른 키는 다른 9 개의 클리어 그리드에 대해 생성됩니다. 키가 0 일 때 값은 0이고 (아록스도 [key] [cur1]) // 9- 클리어 그리드의 판단은 행의 판단과 유사합니다. 3 else subsudo [key] [cur1] = cur1} else {// 이것은 작은 9 개의 작은 그리드에서 첫 번째 요소를 생성합니다. IT Subsudo [key] [cur1] = cur1}}} return 0; // 프로그램이 이것을 실행할 수 있으며, 계획이 유효하다는 것을 나타냅니다} 3. 관련 20 범주 결정 원칙은 전반적인 판단과 동일하며 하이라이트는 작은 9- 케이지 그리드의 위치에 있습니다. 함수 check20grid (sudo, i, j) {let row = {}, col = {}, subsudo = {} // (k = 0; k <9; k ++) {let cur1 = sudo [i] [k], cur2 = sudo [k] [j] {// 전류 요소가 제로에 나타났습니다. 키가 0 인 경우 값은 0이고 (row [cur1]) 반환 1 인 경우 추가 판단이 필요하지 않습니다. // 반환 오류 코드 else row [cur1] = cur1 // 현재 요소가 행에 표시되지 않으며 보조 변수에 저장됩니다} if (cur2) {// 열의 판단은 행과 유사합니다. 0 손실의 판단은 최적화됩니다. 키가 0 인 경우 값은 0입니다. (col [cur2]) 반환 2 인 경우 추가 판단이 필요하지 않습니다. else col [cur2] = cur2; } // 아홉 번째 그리드에 대한 변환 루프 변수의 좌표는 key = sudo [math.floor (i/3)*3 + math.floor (k/3)] [math.floor (j/3)*3 + math.floor (k%3)] // 아홉 번째 그리드의 판단이 행과 유사합니다. 0 손실의 판단은 최적화됩니다. 키가 0 인 경우 값은 0입니다. 추가 판단이 필요하지 않습니다. 3 else subsudo [key] = key} 반환 0;}4. 트래버스 솔루션
요소 상태에서 초기 값이 0 인 요소를 사용하는 것은 보류중인 기능이며 스택을 지원하면 추가 저장 공간이 열리지 않습니다.
function findAnswer () {for (let i = 0; i <9; i ++) {for (let J = 0; j <9;) {if (문제 [i] [j] === 0 || 플래그) {// 현재 위치는 현재 위치로 결정되거나 뒤로 돌아갈 요소의 첫 번째 처리입니다. 두 상황은 다른 것처럼 보이지만 실제로 처리는 동일합니다. 1을 혼자서 추가하십시오. 플래그 = 거짓; k = 문제 [i] [J] + 1하자; // 다음 법적 값으로 이동하는 동안 검색 (k <10) {// 다음 법적 가치 문제를 찾기 위해 루프 [i] [j] = k; // if (check20Grid (문제, i, j) == 0) {// 기본값은 합법적이며 관련성이 25 개의 판결은 stack.push ([i, j ++]) // 트레이스 백 포인트를 저장하고 중단 단계로 향합니다. } k ++; } if (k> 9) {// 법적 값은 현재 위치에서 찾을 수 없습니다. 트레이스 백 문제 [i] [j] = 0; // 트레이스 백 전에 리턴하자 rt = stack.pop (); // 스택에서 트레이스 백 정보를 검색하면 (! rt) // 솔루션 판단 없음, 반환 0 리턴 0; i = rt [0] // travel j = rt [1] flag = true; }} else {// 현재 위치 번호는 j ++; }}} 반환 1; // 솔루션 세트를 성공적으로 찾았습니다}