編寫一個程序,通過已填充的空格來解決數獨問題。
一個數獨的解法需遵循如下規則:
數字 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;
}
};
代碼精進之路
代碼精進之路,我們一起成長!
