考点
for k in 0 to 9:
temp_x = 3 * (x / 3) + k / 3
temp_y = 3 * (y / 3) + k % 3
37. Sudoku Solver
class Solution {
public void solveSudoku(char[][] board) {
if (board == null || board.length == 0) return;
solve(board);
}
private boolean solve(char[][] board){
int n = board.length, m = board[0].length;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (board[i][j] == '.'){
for (char c = '1'; c <= '9'; c++){
if (valid(board, i, j, c)){
board[i][j] = c;
if (solve(board)){
return true;
}
else{
board[i][j] = '.';
}
}
}
return false;
}
}
}
return true;
}
private boolean valid(char[][] board, int x, int y, char c){
for (int k = 0; k < 9; k++){
//col
if (k != x && board[k][y] == c) return false;
//row
if (k != y && board[x][k] == c) return false;
//grid
int tempX = 3 * (x / 3) + k / 3;
int tempY = 3 * (y / 3) + k % 3;
if (tempX != x && tempY != y && board[tempX][tempY] == c) return false;
}
return true;
}
}
36. Valid Sudoku
public class Solution {
public boolean isValidSudoku(char[][] board) {
boolean[] visited = new boolean[9];
// col
for (int i = 0; i < 9; i++){
Arrays.fill(visited, false);
for (int j = 0; j < 9; j++){
if (!check(visited, board[i][j])){
return false;
}
}
}
// row
for (int i = 0; i < 9; i++){
Arrays.fill(visited, false);
for (int j = 0; j < 9; j++){
if (!check(visited, board[j][i])){
return false;
}
}
}
// grid
for (int i = 0; i < 9; i+=3){
for (int j = 0; j < 9; j+=3){
Arrays.fill(visited, false);
for (int k = 0; k < 9; k++){
if (!check(visited, board[i + k / 3][j + k % 3])){
return false;
}
}
}
}
return true;
}
private boolean check(boolean[] visited, char digit){
if (digit == '.'){
return true;
}
int num = digit - '0';
if (num < 0 || num > 9 || visited[num - 1]){
return false;
}
visited[num - 1] = true;
return true;
}
}