编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
分析
解数独问题是回溯思想中比较经典的问题啦,9*9一共81个格子,每个格子都放入1-9数字尝试是否满足条件,见代码
代码
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
Backtrace(board, 0, 0);
}
bool Backtrace(vector<vector<char>>& board, int row, int col) {
if (col == 9) {
row += 1;
col = 0;
if (row == 9) {
return true;
}
}
if (board[row][col] == '.') {
for (char i = '1'; i <= '9'; ++i) {
if (IsValid(board, row, col, i)) {
board[row][col] = i;
if (Backtrace(board, row, col+1)) return true;
board[row][col] = '.';
}
}
} else {
return Backtrace(board, row, col+1);
}
return false;
}
bool IsValid(vector<vector<char>>& board, int row, int col, char value) {
for (int i = 0; i < 9; ++i) {
if (board[i][col] == value) return false;
if (board[row][i] == value) return false;
}
int imin = row / 3 * 3;
int jmin = col / 3 * 3;
int imax = (row + 3) / 3 * 3;
int jmax = (col + 3) / 3 * 3;
for (int i = imin; i < imax; ++i) {
for (int j = jmin; j < jmax; ++j) {
if (board[i][j] == value) return false;
}
}
return true;
}
};
代码精进之路
代码精进之路,我们一起成长!