题目描述:
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
解题思路:使用回溯法
AC代码如下:
class Solution {
public:
bool isOK(const vector<vector<char>>& board, const vector<int>& positions,int index)
{
int row = positions[index] / 9;
int col = positions[index] % 9;
int count[10] = { 0 };
for (int i = 0; i < 9; i++){
if (board[row][i] != '.'){
int num = board[row][i] - '0';
count[num]++;
if (count[num]>1 && num>0){
return false;
}
}
}
int count2[10] = { 0 };
for (int i = 0; i < 9; i++){
if (board[i][col] != '.'){
int num = board[i][col] - '0';
count2[num]++;
if (count2[num]>1 && num>0){
return false;
}
}
}
int count3[10] = { 0 };
int a = row / 3;
int b = col / 3;
for (int i = 0; i < 9; i++){
int c = i / 3;
int d = i % 3;
char tmp = board[3 * a + c][3 * b + d];
if (tmp != '.'){
int num = tmp - '0';
count3[num]++;
if (count3[num]>1 && num>0){
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board)
{
int n = 0;
vector<int> values;
vector<int> positions;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++){
if (board[i][j] == '.'){
n++;
board[i][j] = '0';
values.push_back(0);
positions.push_back(9 * i + j);
}
}
int index = 0;
while (index >= 0){
values[index]++;
board[positions[index] / 9][positions[index] % 9]++;
while (values[index] < 10 && !isOK(board, positions, index)){
values[index]++;
board[positions[index] / 9][positions[index] % 9]++;
}
if (values[index] >= 10){
values[index] = 0;
board[positions[index] / 9][positions[index] % 9] = '0';
index--;
}
else{
if (index == n - 1){
return;
}
else{
index++;
}
}
}
}
};