要求:如题
思路:回溯,还可以优化就是开数组把每行每列每个九宫格出现的数全记下来,继续还可以位运算优化啥的没看
class Solution {
public:
vector<vector<int>> dot;
void finddot(vector<vector<char>>& board){
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
if(board[i][j]=='.')
dot.push_back({i,j});
}
bool inrow(int num,vector<vector<char>>& board,int i){
for(int k=0;k<9;++k)
if(board[i][k]==num+'0')return true;
return false;
}
bool incol(int num,vector<vector<char>>& board,int j){
for(int k=0;k<9;++k)
if(board[k][j]==num+'0')return true;
return false;
}
bool innine(int num,vector<vector<char>>& board,int i,int j){
for(int ii=i/3*3;ii<i/3*3+3;++ii)
for(int jj=j/3*3;jj<j/3*3+3;++jj)
if(board[ii][jj]==num+'0')return true;
return false;
}
void dfs(bool &complete,vector<vector<char>>& board,int cur){
if(cur==dot.size()){
complete=true;
return;
}
int i=dot[cur][0],j=dot[cur][1];
for(int num=1;num<=9;++num){
if(!inrow(num,board,i)&&!incol(num,board,j)&&!innine(num,board,i,j)&&!complete){
board[i][j]=num+'0';
dfs(complete,board,cur+1);
}
}
if(!complete)board[i][j]='.';
}
void solveSudoku(vector<vector<char>>& board) {
bool complete=false;
finddot(board);
dfs(complete,board,0);
}
};