2013-02-17 139 views
1

我發現這個數獨求解器,當它試圖解決難題和更好的理解時使用回溯,我想延遲這個過程,所以我可以分析回溯。但我真的不知道該怎麼做。我試圖使用Thread.sleep(100);,但我不知道在哪裏放置延遲。延遲遞歸回溯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

使用調試器逐步完成。 – 2013-02-17 17:11:43

+0

即時通訊相當肯定他不知道如何調試 – Michael 2013-02-17 17:12:51

+0

尋找[recursive](http://en.wikipedia.org/wiki/Recursion_%28computer_science%29)方法調用 - 你想睡覺之前調用這些。 – 2013-02-17 17:14:11

回答

0

如何在這裏:

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

注意sleep有需要處理的(即使不是拋出)異常,所以最簡單的辦法:

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

即:

  • 經過set
  • 遞歸調用之前

上面的任一個或兩個通常都是很好的候選者(取決於具體情況)。

你甚至可以把它裏面setCell方法。

+0

我補充說,拋出但Im獲取此錯誤:異常在線程「AWT-EventQueue-0」java.lang.Error:未解決的編譯問題: 未處理的異常類型InterruptedException – 2013-02-17 17:18:27

+0

@BobSmith請參閱編輯。 – Dukeling 2013-02-17 17:21:02

+0

該程序凍結,然後幾秒鐘後所有的數字立即彈出。 – 2013-02-17 17:21:08