Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
思路:经典的bracktracking,tricky的点在于base case如何return true,这个题是loop完所有的点之后就return true。isSafeBoard的时候,计算subbox,要注意:(x/3)*3, (y/3)*3,可以定位到这个x,y的最左上角。try完了,1~9,如果不行,直接return false,如果走到了两个循环的最后,表明resolve完了,直接return true;
class Solution {
public void solveSudoku(char[][] board) {
solveSudokuHelper(board);
}
public boolean solveSudokuHelper(char[][] board) {
int m = board.length;
int n = board[0].length;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == '.') {
for(char k = '1'; k <= '9'; k++) {
board[i][j] = k;
if(isvalid(board, i, j) && solveSudokuHelper(board)) {
return true;
}
board[i][j] = '.';
}
return false;
}
}
}
return true; // 这里是return true;
}
private boolean isvalid(char[][] board, int x, int y) {
int m = board.length;
int n = board[0].length;
char c = board[x][y];
// check row;
for(int j = 0; j < n; j++) {
if(j != y && board[x][j] == c) {
return false;
}
}
// check col;
for(int i = 0; i < m; i++) {
if(i != x && board[i][y] == c) {
return false;
}
}
// check cube;
for(int i = x / 3 * 3; i < x / 3 * 3 + 3; i++) {
for(int j = y / 3 * 3; j < y / 3 * 3 + 3; j++) {
if(i != x && j != y && board[i][j] == c) {
return false;
}
}
}
return true;
}
}