2013-04-22 169 views
0

我有點卡住了數獨算法,我使用回溯編碼它,並遵循理論上的步驟,這應該工作,我試圖貶低它,但太難了(是的,它解決了一些數字和做事)Sudoku算法與回溯不返回任何解決方案

我粘貼代碼,我希望你能幫助我,我實在看不出是哪裏的問題......

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- to-sudoku-generator?rq = 1)[or this one](http://stackoverflow.com/questions/9404673/sudoku-solver-in-java-using-backtracking-and-recursion?rq=1)[even這一個](http://stackoverflow.com/questions/6432794/why-is-this-sudoku-backtracking-getting-stuck?rq=1) – icrovett 2013-04-22 17:05:33

+0

我做到了,我的解決方案是基於這些問題,但它doesn沒有工作....我不只是爲了好玩而問:S – Santanor 2013-04-22 18:25:39

回答

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

它工作!謝謝,但是......如果我可以的話,我還有其他問題要問你。如果Sudoku的構建不好,我想找到所有可用的解決方案?我不能簡單地刪除「System.exit」這一行....我必須回想一下「回溯」方法嗎?或簡單地修改「行」當然我想知道什麼是正確的方式來做到這一點,而不僅僅是「這個作品,我不知道爲什麼:P」 – Santanor 2013-04-22 18:35:22

+0

好問題。僅僅刪除System.exit將不起作用,因爲row是9,接下來你要訪問m [row] [col]。調用回溯(0,0)將再次打印相同的解決方案。我認爲(未測試),你將不得不添加另一個回溯變量witch以不同的數字啓動for循環:for(int j = n; j raffael 2013-04-23 09:45:32

+0

hi ,也許你不在乎,但必須改變「下一個」methot,使algotithm aviable找到所有的解決方案,這很容易,並沒有太多的線要改變,但我做到了! :d – Santanor 2013-04-24 16:27:35