版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l718531794/article/details/85111240
题目地址:https://leetcode-cn.com/problems/sudoku-solver/
思路:预处理每行每列每块能取得数,dfs。
AC代码:
class Solution {
public:
bool flag_1[10][10];
bool flag_2[10][10];
bool flag_3[10][10];
bool solve(vector<vector<char>>& board,int x,int y){
for(int i=x;i<9;i++){
for(int j=y;j<9;j++){
int now = i/3 * 3 + j/3;
//cout<<now<<endl;
if(board[i][j] == '.'){
//cout<<i<<" "<<j<<endl;
for(int k = 1;k <= 9;k++){
if(!flag_1[i][k] && !flag_2[j][k] && !flag_3[now][k] ){
board[i][j] = k+'0';
flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = true;
if(solve(board,i,j))
return true;
flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = false;
board[i][j] = '.';
}
}
return false;
}
}
y = 0;
}
for(int i=0;i<9;i++){
for(int j=1;j<=9;j++){
if(!flag_1[i][j] || !flag_2[i][j] || !flag_3[i][j] )
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
memset(flag_1,false,sizeof(flag_1));
memset(flag_2,false,sizeof(flag_2));
memset(flag_3,false,sizeof(flag_3));
for(int i=0;i<9;i++)
for(int j=0;j<9;j++){
if(board[i][j] == '.')
continue;
flag_1[i][board[i][j]-'0'] = true;
}
for(int i=0;i<9;i++)
for(int j=0;j<9;j++){
if(board[j][i] == '.')
continue;
flag_2[i][board[j][i]-'0'] = true;
}
int xx[10] = {0,0,0,1,1,1,2,2,2};
int yy[10] = {0,1,2,0,1,2,0,1,2};
for(int i=0;i<=6;i+=3)
for(int j=0;j<=6;j+=3){
int now = (i*3+j)/3;
for(int k = 0;k<9;k++){
if(board[i+xx[k]][j+yy[k]] == '.')
continue;
flag_3[now][board[i+xx[k]][j+yy[k]]-'0'] = true;
}
}
solve(board,0,0);
}
};