原题地址数组
建议解锁 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; } };