2013-04-22 2 views
0

을 반환하지 않습니다 내가 스도쿠 알고리즘으로 붙어 조금, 내가 그것을 철수 사용하고이 작업을해야 theorical 단계에 따라 구분하고, 내가 그것을 debuge하려고했으나 하드 너무 해요 (어디에 문제가 그래, 그것은) 내가 코드를 붙여스도쿠 알고리즘은 모든 솔루션

을 몇 가지 숫자를 해결하고 일을, 난 희망 당신이 나를 도울 수, 난 정말 내가 ommited

public void backtracking(int row,int col){ 
    if(row > 8){ 
     System.out.println("Solution Found!!"); 
     printSudoku(); 

    } 
    if (m[row][col] != 0){ 
     next(row, col); 
    } 
    else { 
     for(int i =1; i < n;i++) 
      if(row(row, i) && col(col, i)) { 
       m[row][col] =i; 
       next(row, col); 
      } 
     m[row][col] = 0; 
    } 


} 

public void next(int row, int col) { 
    if(col < 8) 
     backtracking(row, col + 1) ; 
    else 
     backtracking(row+ 1, 0) ; 
} 

public boolean region(int x, int y, int numReg) { 
    x = (x/3) * 3 ; 
    y = (y/3) * 3 ; 
    for(int r = 0; r < 3; r++) 
     for(int c = 0; c < 3; c++) 
     if(m[x+r][y+c] == numReg) 
      return false ; 

    return true ; 
} 

public boolean row(int x, int k){ 
    for(int i =0; i < 9; i++) 
     if(m[x][i] == k) 
      return false; 
    return true; 
} 

public boolean col(int x, int k){ 
    for(int i =0; i < 9; i++) 
     if(m[i][x] == k) 
      return false; 
    return true; 
} 

... 볼 수 없습니다 "printSudoku"메쏘드는 단지 두 배에 불과합니다.

+0

을 이미 즉, 역 추적 및 스도쿠 대한 questiions를 읽었다 : [이 질문] (http://stackoverflow.com/questions/9959172/recursive-solution- 투 스도쿠 발전기? 심지어 [(http://stackoverflow.com/questions/9404673/sudoku-solver-in-java-using-backtracking-and-recursion?rq=1)) = 1 RQ [또는 이와] 이 하나] (http://stackoverflow.com/questions/6432794/why-is-this-sudoku-backtracking-getting-stuck?rq=1) – icrovett

+0

은 내가했고, 질문하는 것이 내 솔루션을 기반으로하지만, 아무튼 '일하지 마라. 나는 단지 재미만을 묻지 않는다. S – Santanor

답변

1

코드는 거의 바로 보인다. 아득히 지역 메서드를 호출하는 것을 잊어 버린 것을 볼 수 있습니다. 변수 n이 어디에서 왔는지 알 수 없습니다. 이 약간 수정 되돌아 방법으로 시도 :

public static void backtracking(int row, int col) { 
    if (row > 8) { 
     System.out.println("Solution Found!!"); 
     printSudoku(); 
     System.exit(0); //exiting after solution is found 
    } 
    if (m[row][col] != 0) { 
     next(row, col); 
    } else { 
     for (int i = 1; i <= 9; i++) //replaced i < n with i<=9 
      if (row(row, i) && col(col, i) && region(row, col, i)) { //calling region method too 
       m[row][col] = i; 
       next(row, col); 
      } 
     m[row][col] = 0; 
    } 

} 
+0

그것이 효과가있다 !! 고마워,하지만 ... 내가 할 수 있다면, 너에게 다른 질문이있어. 스도쿠가 나쁘다면 모든 솔루션을 이용할 수 있습니까? 나는 단순히 "System.exit"라인을 삭제할 수 없다 .... 나는 "backtracking"방법을 기억해야만 하는가? 또는 단순히 내가 그것을 할 수있는 올바른 방법이 무엇인지 알고 싶어 물론 "행"을 수정하지 그냥 "이 작품과 이유를 모르겠어요 : P" – Santanor

+0

좋은 질문입니다. 행이 9이고 다음으로 할 일은 m [row] [col]에 대한 액세스이기 때문에 단순히 System.exit을 제거하면 작동하지 않습니다. 역 추적 (0,0)을 호출하면 동일한 솔루션이 다시 인쇄됩니다. 난 당신이 다른 역 추적 변수 마녀가 다른 번호로 루프의 시작 추가해야합니다 (테스트하지) 생각 : (; J raffael

+0

인사 어쩌면 당신은 신경 쓰지 않아도되지만, "다음"메쏘을 변경해야만 모든 해결책을 찾을 수있게 알 수 있습니다. 변경하기가 너무 쉽지 않고 쉽게 할 수 있습니다. :디 – Santanor