原題地址數組
建議解鎖 Leetcode - 036. Valid Sudoku 以後再處理本題debug
個人思路:
1.須要遍歷整個解空間求得可行解,隸屬 dfs + backtracing
2.須要used數組記錄每行,每列,每塊的數字佔用狀況
2.1 初始數組指定一部分const 的佔用狀況
2.2 dfs的過程當中會更新used,backtraing 的過程會抹去上一次的嘗試
3.一個隱藏的trick是dfs + backtracing在總體退出以後會回到進入以前的狀態,因此退出以後
board會跟原始狀態一致,因此須要另一個board存儲解
新手注意:(當時由於這一點困擾了我一個夜晚,dfs + backtraing 又很差debug,蛋疼)code
class Solution { public: void dfs(vector<vector<char>> &ans, vector<vector<char>> & board, vector<vector<int>> &row, vector<vector<int>> &col, vector<vector<int>> bok, int cur_i, int cur_j) { if (cur_j >= 9) { cur_j = 0; ++cur_i; } if (cur_i >= 9) { ans = board; return; } char ch = board[cur_i][cur_j]; if (ch != '.') { dfs(ans, board, row, col, bok, cur_i, cur_j + 1); } // 試圖在board[cur_i][cur_j]的位置放上val for (int val = 1; val <= 9; ++val) { int cur_k = 3 * (cur_i / 3) + cur_j / 3; if (row[cur_i][val] == 0 && col[cur_j][val] == 0 && bok[cur_k][val] == 0) { row[cur_i][val] = 1; col[cur_j][val] = 1; bok[cur_k][val] = 1; board[cur_i][cur_j] = char(val + '0'); dfs(ans, board, row, col, bok, cur_i, cur_j + 1); board[cur_i][cur_j] = ch; row[cur_i][val] = 0; col[cur_j][val] = 0; bok[cur_k][val] = 0; } } } void solveSudoku(vector<vector<char>>& board) { vector<vector<char>> ans; vector<vector<int>> row(9, vector<int>(10, 0)); vector<vector<int>> col(9, vector<int>(10, 0)); vector<vector<int>> bok(9, vector<int>(10, 0)); for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { char ch = board[i][j]; if (ch == '.') continue; int num = ch - '0'; int k = 3 * (i / 3) + j / 3; row[i][num] = 1; col[j][num] = 1; bok[k][num] = 1; } } dfs(ans, board, row, col, bok, 0, 0); board = ans; } };