37. 解數獨
編寫一個程序,通過填充空格來解決數獨問題。
數獨的解法需 遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。(請參考示例圖)
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。
https://leetcode.cn/problems/sudoku-solver/submissions/618100739/
class Solution {
public:bool rows[9][9];bool cols[9][9];bool cubes[9][9];vector<pair<int, int>> blanks; // 存儲blanks空白的格子bool valid = false;void dfs(vector<vector<char>>& board, int pos) {if (blanks.size() == pos) {valid = true;return;}auto [i, j] = blanks[pos];for (int num = 0; num < 9 && !valid; ++num) {if (!rows[i][num] && !cols[j][num] && !cubes[((int)(i / 3)) * 3 + (j / 3)][num]) {rows[i][num] = 1;cols[j][num] = 1;cubes[((int)(i / 3)) * 3 + (j / 3)][num] = 1;board[i][j] = num + '0' + 1;dfs(board, pos + 1);// 如果沒有成功,那么返回rows[i][num] = 0;cols[j][num] = 0;cubes[((int)(i / 3)) * 3 + (j / 3)][num] = 0;}}return;}void solveSudoku(vector<vector<char>>& board) {memset(rows, false, sizeof(rows));memset(cols, false, sizeof(cols));memset(cubes, false, sizeof(cubes));for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int cur_num = board[i][j] - '1';rows[i][cur_num] = 1;cols[j][cur_num] = 1;// cube要算一下是第幾個cubecubes[((int)(i / 3)) * 3 + (j / 3)][cur_num] = 1;} else {// i,j空白了blanks.emplace_back(i, j);}}}dfs(board,0);}
};