题目:37. 解数独
思路:回溯。
在每一个空格处尝试放入1~9,需要注意的是,如果找到解就不回溯了,因为我们要把解存在原来的数据结构里。
代码:
class Solution {
private boolean[][] row = new boolean[9][9];
private boolean[][] col = new boolean[9][9];
private boolean[][] box = new boolean[9][9];
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int n = board[i][j] - '0';
row[i][n - 1] = true;
col[j][n - 1] = true;
box[i / 3 * 3 + j / 3][n - 1] = true;
}
}
}
backtrack(board, 0, 0);
}
public boolean backtrack(char[][] board, int a, int b) {
while (board[a][b] != '.') {
b++;
if (b >= 9) {
a++;
b = 0;
}
if (a >= 9) {
return true;
}
}
for (int i = 0; i < 9; i ++) {
if (!row[a][i] && !col[b][i] && !box[a / 3 * 3 + b / 3][i]) {
board[a][b] = (char) (i + '0' + 1);
row[a][i] = true;
col[b][i] = true;
box[a / 3 * 3 + b / 3][i] = true;
// 找到解就不回溯。
if (backtrack(board, a, b)) {
return true;
}
else {
board[a][b] = '.';
row[a][i] = false;
col[b][i] = false;
box[a / 3 * 3 + b / 3][i] = false;
}
}
}
return false;
}
}
class Solution {
private boolean[][] row = new boolean[9][9];
private boolean[][] col = new boolean[9][9];
private boolean[][] box = new boolean[9][9];
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int n = board[i][j] - '0';
row[i][n - 1] = true;
col[j][n - 1] = true;
box[i / 3 * 3 + j / 3][n - 1] = true;
}
}
}
backtrack(board, 0, 0);
}
public boolean backtrack(char[][] board, int a, int b) {
if (b >= 9) {
return backtrack(board, a+1, 0);
}
if (a >= 9) {
return true;
}
if (board[a][b] != '.') {
return backtrack(board, a, b+1);
}
for (int i = 0; i < 9; i ++) {
if (!row[a][i] && !col[b][i] && !box[a / 3 * 3 + b / 3][i]) {
board[a][b] = (char) (i + '0' + 1);
row[a][i] = true;
col[b][i] = true;
box[a / 3 * 3 + b / 3][i] = true;
// 找到解就不回溯。
if (backtrack(board, a, b + 1)) {
return true;
}
else {
board[a][b] = '.';
row[a][i] = false;
col[b][i] = false;
box[a / 3 * 3 + b / 3][i] = false;
}
}
}
return false;
}
}