题目
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.
分析
数独问题。
和N-Queens Permutation 都采用回溯法!
实现
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
if (board.size() != 9 || board[0].size() != 9)
return;
solver(board, 0, 0);
}
bool solver(vector<vector<char>>& board, int row, int col)
{
//列数满了的话,转移到下一行
if (col == 9)
return solver(board, row + 1, 0);
if (row == 9)
return true;
if (board[row][col] == '.')
{
//测试1-9 数字是否合法
for (int k = 1; k <= 9; k++)
{
board[row][col] = (char)(k + '0');
//如果数字合法的话,列数+1
if (isValid(board, row, col))
{
if (solver(board, row, col + 1))
return true;
}
board[row][col] = '.';
}
}
else
{
return solver(board, row, col + 1);
}
return false;
}
//判断该位置的数字是否合法
bool isValid(vector<vector<char>> & board,int row,int col)
{
//所在的行是否合法
for (int k = 0; k < 9; k++)
{
if (k != row && board[k][col] == board[row][col])
return false;
}
//所在的列是否合法
for (int k = 0; k < 9; k++)
{
if (k != col && board[row][k] == board[row][col])
return false;
}
//所在的九宫格区块是否合法
for (int i = (row / 3 * 3); i < (row / 3 * 3 + 3); i++)
{
for (int j = (col / 3 * 3); j < (col / 3 * 3 + 3); j++)
{
if ((i != row || j != col) && board[i][j] == board[row][col])
return false;
}
}
return true;
}
};