題目網址:https://leetcode.cn/problems/sudoku-solver/
題意:寫一程式, 可填充空格來解決數獨問題。
數獨的解法需遵從以下規則:
- 數字
1-9
在每一行只能出現一次
- 數字
1-9
在每一列只能出現一次
- 數字
1-9
在每一個以粗實線分隔的 3x3
九宮格內只能出現一次
數獨部分空格已填入數字, 而空格用 '.'
來表示。

Solution:
想法:利用 DFS + Backtracking
class Solution { public: void solveSudoku(vector<vector<char>>& board) { fill(board, 0, 0); }
private: bool fill(vector<vector<char>>& board, int y, int x){ if (y == 9) { return true; }
const int nextY = (x == 8) ? y + 1 : y; const int nextX = (x == 8) ? 0 : x + 1;
if (board[y][x] == '.') { for (char ch = '1'; ch <= '9'; ++ch) { if (!isValid(board, y, x, ch)) { continue; }
board[y][x] = ch;
if (fill(board, nextY, nextX)) { return true; }
board[y][x] = '.'; } } else { return fill(board, nextY, nextX); }
return false; }
bool isValid(const vector<vector<char>>& board, const int y, const int x, const char ch){ for (int i = 0; i < 9; ++i) { if (board[y][i] == ch) { return false; }
if (board[i][x] == ch) { return false; }
int blockY = 3 * (y / 3) + (i / 3); int blockX = 3 * (x / 3) + (i % 3);
if (board[blockY][blockX] == ch) { return false; } }
return true; } };
|
- time:$O(9^m)$ ➔
m
為所有的空格數, 每一個空格最多有 9
種選擇
- space:$O(1)$ ➔ $O(9*9)$, 遞迴深度最多不超過
9 * 9