数独
回溯
使用三个数组记录状态 行 列 九宫格
class Solution {
public boolean[][] v1 = new boolean[9][10];
public boolean[][] v2 = new boolean[9][10];
public boolean[][] v3 = new boolean[9][10];
public void solveSudoku(char[][] board) {
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
v1[i][board[i][j]-'0'] = true;
v2[j][board[i][j]-'0'] = true;
v3[i/3*3+j/3][board[i][j]-'0'] = true;
}
}
}
solve(board);
}
public boolean solve(char[][] b){
boolean f = true;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(b[i][j]=='.'){
f = true;
for(int k=1;k<10;k++){
if(!v1[i][k] && !v2[j][k] && !v3[i/3*3+j/3][k]){
//System.out.println(i+" "+j+" "+k);
f = false;
b[i][j] =(char)(k + '0');
v1[i][k] = true;
v2[j][k] = true;
v3[i/3*3+j/3][k] = true;
if(solve(b)){
return true;
//break;
}
b[i][j] = '.';
v1[i][k] = false;
v2[j][k] = false;
v3[i/3*3+j/3][k] = false;
}
}
if(f||b[i][j]=='.'){
return false;
}
}
}
}
return true;
}
}