本题源自leetcode 37
-------------------------------------------------------------------------------------
思路: 1 用回溯法。从(0,0)开始访问数组,试着将1-9填充。
代码:
void solveSudoku(vector<vector<char>>& board) {
int row = board.size();
if(row != 9)
return ;
int col = board[0].size();
if(col != 9)
return;
solveSudo(board,0,0);
}
bool solveSudo(vector<vector<char>>& board,int i,int j){
if(i == 9)
return true;
if(j == 9)
return solveSudo(board,i + 1, 0);
if(board[i][j] != '.') //说明已经填数了,直接进入下一个位置
return solveSudo(board,i, j + 1);
for(char c = '1'; c <= '9'; c++){
if(check(board,i, j, c)){ //回溯法
board[i][j] = c;
if(solveSudo(board, i, j + 1))
return true;
board[i][j] = '.';
}
}
return false;
}
bool check(vector<vector<char>>& board,int i, int j, char val){
int row = i - i%3, col = j - j%3;
for(int m = 0; m < 9; m++){ //检查每一列
if(board[m][j] == val)
return false;
}
for(int m = 0; m< 9; m++){ //检查每一行
if(board[i][m] == val)
return false;
}
for(int m = 0; m < 3; m++){ //检查每一个框
for(int n = 0; n < 3; n++){
if(board[m+row][n+col] == val)
return false;
}
}
return true;
}