编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
思路:
遍历数组,如果遇到空位就将1-9顺序填进去,判断是否为合法的,合法的话就暂时确定此处的值;然后递归判断此时的数组重复上述步骤;如果任何一个数都不合法,返回false,且将当前层填过的数字置0;当递归遍历完成返回true;
代码:
public class IsValidSudoku37 {
public void solveSudoku(char[][] board) {
if (board.length == 0 || board == null) {
return;
}
sovel(board);
}
private boolean sovel(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 ch = '1'; ch <= '9'; ch++) {
if (isValidSudoku(board, i, j, ch)) {
board[i][j] = ch;
if (sovel(board)) {
return true;
}
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
private boolean isValidSudoku(char[][] board, int row, int col, char ch) {
for (int i = 0; i < 9; i++) {
if (board[i][col] != '.' && board[i][col] == ch)
return false;
if (board[row][i] != '.' && board[row][i] == ch)
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] == ch)
return false;
}
return true;
}
}