用回溯法解出了所有可能的解。
class Solution {
public:
vector<vector<vector<char>>> res;
void solveSudoku(vector<vector<char>>& board) {
dfs(0, board);
board = res[0];
}
bool check(int num, vector<vector<char>> board)
{
int x = num/9;
int y = num%9;
for(int i = 0; i < 9; ++i)
{
if(i != x && board[i][y] == board[x][y])
{
return false;
}
if(i != y && board[x][i] == board[x][y])
{
return false;
}
}
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 3; ++j)
{
if(board[i+(x/3)*3][j+(y/3)*3] == board[x][y] && i+(x/3)*3 != x && j+(y/3)*3 != y)
{
return false;
}
}
}
return true;
}
void dfs(int num, vector<vector<char>>& board)
{
if(num == 81)
{
res.push_back(board);
return;
}
int x = num/9;
int y = num%9;
if(board[x][y] != '.')
{
dfs(num+1, board);
}
else
{
for(int i = 1; i <=9; ++i)
{
board[x][y] = char(i + '0');
if(check(num, board))
{
dfs(num+1, board);
}
board[x][y] = '.';
}
}
}
};