回溯方法,比较简单。
判定是否有重复元素的时候发现原生数组要比vector效率高不少。
class Solution {
public:
bool _isValid(vector<vector<char> > &board,int i,int j){
int tmp[10]={0};
for(int p=0;p<3;++p){
for(int q=0;q<3;++q){
if(board[i+p][j+q]!='.'){
if(tmp[board[i+p][j+q]-'0']!=0)
return false;
else
++tmp[board[i+p][j+q]-'0'];
}
}
}
return true;
}
bool _isValid2(vector<vector<char> > &board,int i,int j){
int tmp[10]={0};
for(int q=0;q<9;++q){
if(board[i][q]!='.'){
if(tmp[board[i][q]-'0']!=0)
return false;
else
++tmp[board[i][q]-'0'];
}
}
int tmp2[10]={0};
for(int p=0;p<9;++p){
if(board[p][j]!='.'){
if(tmp2[board[p][j]-'0']!=0)
return false;
else
++tmp2[board[p][j]-'0'];
}
}
if(!_isValid(board,i/3*3,j/3*3))
return false;
return true;
}
bool _solveSudoku(vector<vector<char> > &board,int i, int j) {
if(i==9)
return true;
int next_i, next_j;
next_i = (j+1)<9?i:(i+1);
next_j = (j+1)<9?(j+1):0;
if(board[i][j]!='.')
return _solveSudoku(board,next_i,next_j);
if(board[i][j]=='.'){
for(char c='1';c<='9';++c){
board[i][j] = c;
if(_isValid2(board,i,j)){
if(_solveSudoku(board,next_i,next_j))
return true;
}
board[i][j]='.';
}
return false;
}
}
void solveSudoku(vector<vector<char> > &board) {
_solveSudoku(board,0,0);
}
};