2014-06-21 7 views
1

스도쿠가 고유 한 솔루션을 가지고 있는지 또는 여러 솔루션을 가지고 있는지 판단하기 위해 백 트랙킹 알고리즘에 어려움을 겪고 있습니다. (다른 솔루션이 존재하는 경우) 내가 다른 해결책을 찾아야한다 두 개의 서로 다른 해결-algorithmns를 얻을 내가스도쿠가 독창적 인 솔루션을 가지고 있는지 확인하십시오.

for (int val = 1; val <= 9; ++val) { 
for (int val = 9; val >= 1; val--) { 

을 변경하는 경우 :

static boolean solve(int i, int j, int[][] cells) { 
    if (i == 9) { 
     i = 0; 
     if (++j == 9) 
      return true; 
    } 
    if (cells[i][j] != 0) // skip filled cells 
     return solve(i+1,j,cells); 

    for (int val = 1; val <= 9; ++val) { 
     if (legal(i,j,val,cells)) { 
      cells[i][j] = val; 
      if (solve(i+1,j,cells)) 
       return true; 
     } 
    } 
    cells[i][j] = 0; // reset on backtrack 
    return false; 
} 

첫 번째 방법 : 여기 내가 사용하는 역 추적 코드입니다. 이 접근 방식의 문제점은 알고리즘이 약간 변경되었지만 그 이유를 모르더라도 알고리즘이 종료되지 않는다는 것입니다.

두 번째 접근 : 다시 추적하여 솔루션을 계속 검색하십시오. 내가 이것을 시도하면, 그것은 또한 작동하지 않는다.

Java 예제를 찾으려고했지만 "다시 추적하고 두 번째 솔루션을 계속 검색"과 같은 정보 만 찾을 수 있습니다.

사람이 여러 솔루션 왜 내 첫 번째 방법

또는

누군가가 나에게 설명해 주시겠습니까 (정확한 숫자가 필요하지 않은)이있는 경우는 저에게 말한다 있도록 알고리즘을 변경하는 방법을 예제를 제공시겠습니까 종료되지 않습니까?

감사합니다.

답변

4

후 당신은 0, 1, 또는 1 개 이상이있는 경우를 구별 할 수, 부울 대신 숫자를 반환하는 경우 솔루션.

// returns 0, 1 or more than 1 depending on whether 0, 1 or more than 1 solutions are found 
static byte solve(int i, int j, int[][] cells, byte count /*initailly called with 0*/) { 
    if (i == 9) { 
     i = 0; 
     if (++j == 9) 
      return 1+count; 
    } 
    if (cells[i][j] != 0) // skip filled cells 
     return solve(i+1,j,cells, count); 
    // search for 2 solutions instead of 1 
    // break, if 2 solutions are found 
    for (int val = 1; val <= 9 && count < 2; ++val) { 
     if (legal(i,j,val,cells)) { 
      cells[i][j] = val; 
      // add additional solutions 
      count = solve(i+1,j,cells, count)); 
     } 
    } 
    cells[i][j] = 0; // reset on backtrack 
    return count; 
} 
+0

왜 바이트를 사용합니까? 최대 127 개의 솔루션을 기대하십니까? 또한 AFAIK'byte'는'int'와 같은 메모리를 사용하기 때문에 실제로 차이가 없습니다. – kajacx

+0

@kajacx : 해결책이 유일한 경우 2 가지 해결책 만 발견하면됩니다. – fabian

+0

하지만 솔루션 수를 확인할 수있는 곳이 어디인지는 알 수 없습니다. 따라서 스도쿠가 256 솔루션을 갖고 있다면 메서드는 0을 반환합니다. – kajacx

2

리셋 루프의 내부에 있어야하며 if solve 조건

for (int val = 1; val <= 9; ++val) { 
     if (legal(i,j,val,cells)) { 
      cells[i][j] = val; 
      if (solve(i+1,j,cells)) 
       return true; 
      cells[i][j] = 0; // reset on backtrack 
     } 
    } 
+0

왜 downvote? – CMPS

+0

고맙습니다. 이제 for 루프가 가동되지 않고 알고리즘이 종료 되더라도 알고리즘이 종료됩니다. – user4758246

+0

두 답이 모두 정확합니다. 불행히도 하나만 받아 들일 수 있습니다. – user4758246