2013-02-17 5 views
1

퍼즐을 풀려고 할 때 역 추적을 사용하는이 스도쿠 솔버를 찾았습니다. 더 나은 이해를 위해 역 추적을 분석 할 수 있도록 프로세스를 지연시키고 싶습니다. 그러나 나는 그것을 어떻게하는지 정말로 모른다. 나는 Thread.sleep(100);을 사용하려고 노력했지만 실제로 지연을 정확히 어디에 두어야하는지 알지 못합니다.Delay recursive backtracking java

abstract class SudoKiller { 
    private SudokuBoard sb; // Puzzle to solve; 

    public SudoKiller(SudokuBoard sb) { 
     this.sb = sb; 
    } 


    private boolean check(int num, int row, int col) { 
     int r = (row/sb.box_size) * sb.box_size; 
     int c = (col/sb.box_size) * sb.box_size; 

     for (int i = 0; i < sb.size; i++) { 
      if (sb.getCell(row, i) == num || 
        sb.getCell(i, col) == num || 
        sb.getCell(r + (i % sb.box_size), c + (i/sb.box_size)) == num) { 
       return false; 
      } 
     } 
     return true; 
    } 


    public boolean guess(int row, int col) { 
     int nextCol = (col + 1) % sb.size; 
     int nextRow = (nextCol == 0) ? row + 1 : row; 

     try { 
      if (sb.getCell(row, col) != sb.EMPTY) 
       return guess(nextRow, nextCol); 
     } 
     catch (ArrayIndexOutOfBoundsException e) { 
      return true; 
     } 

     for (int i = 1; i <= sb.size; i++) { 
      if (check(i, row, col)) { 
       sb.setCell(i, row, col); 
       if (guess(nextRow, nextCol)) { 
        return true; 
       } 
      } 
     } 
     sb.setCell(sb.EMPTY, row, col); 
     return false; 
    } 
} 

전체 프로젝트는 the authors site에서 찾을 수 있습니다.

+1

디버거를 통해 단계별로 진행하십시오. –

+0

메신저 꽤 잘 모르겠다. 디버그하는 방법을 알지 못한다. – Michael

+0

[재귀] (http://en.wikipedia.org/wiki/Recursion_%28computer_science%29) 메소드 호출을 찾아라. 호출하기 전에 잠자고 싶다. –

답변

0

어떻게 여기에 대해 :

sb.setCell(i, row, col); 
try { Thread.sleep(100); } catch(InterruptedException e) {} 
if (guess(nextRow, nextCol)) { 

입니다 :

sleep은 (슬로우되지 않는 경우에도) 처리 할 필요가 예외, 그래서 가장 간단한 솔루션을

sb.setCell(i, row, col); 
Thread.sleep(100); 
if (guess(nextRow, nextCol)) { 

  • set
  • 재귀 호출 전

위의 두 가지 또는 모두가 일반적으로 좋은 후보자입니다 (상황에 따라 다름).

setCell 방법 안에 넣을 수도 있습니다.

+0

나는 그 incl를 더했다. 예외 : AWT-EventQueue-0 예외 : java.lang.Error : 해결되지 않은 컴파일 문제 : 처리되지 않은 예외 유형 InterruptedException –

+0

@BobSmith 편집을 참조하십시오. – Dukeling

+0

프로그램이 정지 한 후 몇 초 후에 모든 숫자가 즉시 팝업됩니다. –