编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
c++回溯法
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
vector<vector<bool>> row(9,vector<bool>(10,false));
vector<vector<bool>> col(9,vector<bool>(10,false));
vector<vector<bool>> block(9,vector<bool>(10,false));
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
int num = board[i][j]-'0';
row[i][num] = true;
col[j][num] = true;
block[i/3*3+j/3][num] = true;
}
}
}
dfs(board,row,col,block,0,0);
}
bool dfs(vector<vector<char>>&board,vector<vector<bool>>& row,vector<vector<bool>>& col,vector<vector<bool>>& block,int i,int j){
while(board[i][j]!='.'){
if(++j>=9){
i++;
j=0;
}
if(i>=9)
return true;
}//找到board[i][j] = '.'的ij坐标
for(int num = 1;num<=9;num++){
int blockIndex = i/3*3+j/3;
if(!row[i][num]&&!col[j][num]&&!block[blockIndex][num]){
//递归
board[i][j] = (char)('0'+num);
row[i][num] = true;
col[j][num] = true;
block[blockIndex][num] = true;
if(dfs(board,row,col,block,i,j)){
return true;
}else{
//回溯
row[i][num] = false;
col[j][num] = false;
block[blockIndex][num] = false;
board[i][j] = '.';
}
}
}
return false;
}
};