實現的java代碼如下(該算法只是將結果打印輸出,并沒有對原數組實現更改):
//判斷a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判斷是否跟同行沖突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判斷是否跟同列沖突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宮格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判斷值是否跟所在九宮格沖突for(int i2=3*i1;i2<3*(i1+1);i2++){ for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;}//打印數獨public void printMatrix(int[][] a){for(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(a[i][j]+" ");}System.out.println();}}//回溯法求解數獨public void shuDu(int[][] a, int i, int j){if(i==8&&j>=9){printMatrix(a);return;}if(j==9){j=0;i++;}if(a[i][j]==0){for(int k=1;k<=9;k++){if(isValid(a,i,j,k)){a[i][j] = k;//向下繼續找shuDu(a,i,j+1);//如果沒有找到全部答案將a[i][j]的值恢復a[i][j] = 0;}}}else{shuDu(a,i,j+1);}}
算法調用示例如下:
public static void main(String[] args) {Solution solu = new Solution();int ma1[][]={{0,3,0,0,0,5,0,6,0},{0,1,0,0,0,3,0,8,0},{0,4,0,0,0,0,0,0,7},{0,0,7,0,2,4,0,0,0},{5,0,0,0,9,0,0,0,0},{0,8,0,3,0,0,5,0,0},{0,0,0,8,0,0,0,0,0},{0,0,9,0,0,0,0,7,3},{0,5,0,9,0,0,0,0,2}};int[][] sudoku = { {8,0,0,0,0,0,0,0,0}, {0,0,3,6,0,0,0,0,0}, {0,7,0,0,9,0,2,0,0}, {0,5,0,0,0,7,0,0,0}, {0,0,0,0,4,5,7,0,0}, {0,0,0,1,0,0,0,3,0}, {0,0,1,0,0,0,0,6,8}, {0,0,8,5,0,0,0,1,0}, {0,9,0,0,0,0,4,0,0}};solu.shuDu(sudoku, 0, 0); }
?不進行打印,實現更改數組的改進算法(數組為字符數組,可根據需要進行更改):
public class Solution {//判斷a[i][j]取值val是否有效public boolean isValid(char[][] a, int i, int j, char val){//判斷是否跟同行沖突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判斷是否跟同列沖突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宮格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判斷值是否跟所在九宮格沖突for(int i2=3*i1;i2<3*(i1+1);i2++){ for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;} //回溯法求解數獨public boolean shuDu(char[][] a, int i, int j){if(i==8&&j>=9){return true;}if(j==9){j=0;i++;}if(a[i][j]=='.'){char ch = '1';for(int k=0;k<9;k++){if(isValid(a,i,j,(char)(ch+k))){a[i][j] = (char) (ch+k);//向下繼續找if(shuDu(a,i,j+1))return true;//如果沒有找到全部答案將a[i][j]的值恢復a[i][j] = '.';}}}else{if(shuDu(a,i,j+1))return true;}return false;}public void solveSudoku(char[][] board) {shuDu(board, 0, 0);} }
?