一、问题
二、分析
这题与普通的回溯算法相比,要注意这几点:
1)只要遇到一个满足的,就结束搜寻。(所以我们的函数返回值用布尔,遇到了就向上传递)
2)如何判断棋盘的正确性。(判断函数,其实本质就是一个剪枝,如果不正确就把这个点剪掉)
三、代码
public void solveSudoku(char[][] board) {backtracking(board);}public boolean backtracking(char[][] board){for (char i = 0; i < 9; i++) {for (char j =0; j < 9; j++) {//前面的两个for循环,相当于就是9*9层的回溯递归树,因为棋盘的81个区域,每个区域都相当于递归树的一层,每层可以取1-9if(board[i][j]=='.'){//遍历所有的空格for (char k = '1'; k <='9' ; k++) {if(PanDuan(i,j,k,board)){//空格里填入符合规格的数字board[i][j]=k;boolean temp= backtracking(board);//用temp来接if(temp==true){return true;}board[i][j]='.';}}return false;//如果某个节点的下一层的9个取值都不行,则这一层返回false,让上一个节点废掉}}}return true;//如果把81层树都走完了,那么说明是有正确的完整的棋盘的,把叶子层的true向上返回}public boolean PanDuan(int row,int col,int i,char[][] board){for (int j = 0; j < board.length; j++) {//遍历第row行每一列,查找有无重复数if(board[row][j]==i){return false;}}for (int j = 0; j < board.length; j++) {//遍历第col列的每一行,查找有无重复数if(board[j][col]==i){return false;}}int row_c=row%3;int col_c=col%3;for (int j = row-row_c;j <= row-row_c+2; j++) {//验证九宫格是否合格for (int k = col-col_c;k<=col-col_c+2; k++) {if(board[j][k]==i){return false;}}}return true;}