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.
backtracking... 基本套路,一个一个试,不对的话回溯充填。。。。这个题有递归的有循环的。。。我觉得都挺好。。。。要注意两个地方:
1. 终止条件是如果col=9那么就要round 一次, 到row+1, 0 去
2. 用1-9来尝试,要首先填进去然后再递归。。。OJ编译器好像有问题?我在线下是先判断再填再递归也能过。。。如果填入有效那么判断下一步,否则回溯。
class Solution {
public:
void solveSudoku(vector<vector<char> > &board) {
solver(board,0,0);
}
bool solver(vector< vector<char> >& tbl, int i, int j){
if (j==9)
return solver(tbl,i+1,0);
if (i==9)
return true;
if (tbl[i][j]=='.'){
for (char k='1'; k<='9'; k++){
tbl[i][j]=k;
if (isValid(tbl,i,j) && solver(tbl,i,j+1))
return true;
tbl[i][j]='.';
}
} else {
return solver(tbl, i,j+1);
}
return false;
}
// check if assign c to tbl[i][j] is valid
bool isValid(const vector< vector<char> >& tbl, int i, int j){
// check row and col
for (int k=0; k<9; k++){
if ( k!=j && tbl[i][k]==tbl[i][j])
return false;
if (k!=i && tbl[k][j]==tbl[i][j])
return false;
}
// check small 9 blocks
for (int a=i/3*3; a<i/3*3+3; a++){
for (int b=j/3*3; b<j/3*3+3; b++){
if (a!=i && b!=j && tbl[a][b]==tbl[i][j])
return false;
}
}
return true;
}
};