编写一个程序,经过已填充的空格来解决数独问题。java
一个数独的解法需遵循以下规则:this
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。code
一个数独。io
答案被标成红色。class
Note:sed
给定的数独序列只包含数字 1-9 和字符 '.' 。
你能够假设给定的数独只有惟一解。
给定数独永远是 9x9 形式的。程序
class Solution { private boolean[][] rowsUsed = new boolean[9][10]; private boolean[][] colsUsed = new boolean[9][10]; private boolean[][] cubesUsed = new boolean[9][10]; private char[][] board; public void solveSudoku(char[][] board) { this.board = board; for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) { if (board[i][j] == '.') { continue; } int num = board[i][j] - '0'; rowsUsed[i][num] = true; colsUsed[j][num] = true; cubesUsed[cubeNum(i, j)][num] = true; } backtracking(0, 0); } private boolean backtracking(int row, int col) { while (row < 9 && board[row][col] != '.') { row = col == 8 ? row + 1 : row; col = col == 8 ? 0 : col + 1; } if (row == 9) { return true; } for (int num = 1; num <= 9; num++) { if (rowsUsed[row][num] || colsUsed[col][num] || cubesUsed[cubeNum(row, col)][num]) { continue; } rowsUsed[row][num] = colsUsed[col][num] = cubesUsed[cubeNum(row, col)][num] = true; board[row][col] = (char) (num + '0'); if (backtracking(row, col)) { return true; } board[row][col] = '.'; rowsUsed[row][num] = colsUsed[col][num] = cubesUsed[cubeNum(row, col)][num] = false; } return false; } private int cubeNum(int i, int j) { int r = i / 3; int c = j / 3; return r * 3 + c; } }