37. 解数独

难度困难505

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 ‘.’ 表示。

public void solveSudoku(char[][] board) {
    if (board == null || board[0].length == 0)  return;
    solve(board);
}

public boolean solve(char[][] board) {
    for (int i=0; i<board.length;i++) {
        for (int j=0;j<board[0].length;j++) {
            if (board[i][j] == '.') {
                for (char c = '1' ; c<= '9' ; c++) {
                    //是否合法
                    if (isValid(board,i,j,c)) {
                        //合法就赋值
                        board[i][j] = c;
                        //递归解决下一个子问题
                        if (solve(board)) {
                            return true;
                        }else {
                            board[i][j] = '.';
                        }
                    }
                }
                return false;
            }
        }
    }
    return true;
}

public boolean isValid(char[][] board,int row,int col,char c) {
    for (int i=0;i<9;i++) {
        if (board[i][col] != '.' && board[i][col] == c) return false;
        if (board[row][i] != '.' && board[row][i] == c) return false;
        if (board[3 * (row / 3) + i/3][3 * (col/3) + i % 3] !='.'
            && board[3 * (row / 3)+ i/3][3 * (col/3) +i % 3] == c) 
            return false;
    }
    return true;
}