解数独
来源:8-8 回溯法是经典人工智能的基础 N Queens
仙女座舜
2019-04-01
第leetcode37号问题,老师您的leetcode代码仓,解数独只能求出一个解,能不能提供一个代码,给出数独的所有解锕
QAQ,我水平不够。估计其他学生也有这个想法QuQ哈哈 :)
写回答
2回答
-
liuyubobobo
2019-04-02
整体代码和我github上的代码一致,只有一些小修改,参见注释。
class Solution { public: void solveSudoku(vector<vector<char>>& board) { vector<vector<bool>> row(9, vector<bool>(10, false)); vector<vector<bool>> col(9, vector<bool>(10, false)); vector<vector<bool>> block(9, vector<bool>(10, false)); for(int i = 0; i < 9; i ++) for(int j = 0; j < 9; j ++) if(board[i][j] != '.'){ row[i][board[i][j] - '0'] = true; col[j][board[i][j] - '0'] = true; block[i / 3 * 3 + j / 3][board[i][j] - '0'] = true; } for(int i = 0; i < 81; i ++) if(board[i / 9][i % 9] == '.'){ dfs(board, i, row, col, block); return; } } private: // dfs不需要返回值了 void dfs(vector<vector<char>>& board, int pos, vector<vector<bool>>& row, vector<vector<bool>>& col, vector<vector<bool>>& block){ if(pos == 81) // 走到这里说明board里存储了一个解,如果需要,可以记录一下 return; int next = pos + 1; for(; next < 81; next ++) if(board[next / 9][next % 9] == '.') break; int x = pos / 9, y = pos % 9; for(int i = 1; i <= 9; i ++) if(!row[x][i] && !col[y][i] && !block[x / 3 * 3 + y / 3][i]){ row[x][i] = true; col[y][i] = true; block[x / 3 * 3 + y / 3][i] = true; board[x][y] = '0' + i; dfs(board, next, row, col, block); // 这里递归调用 // 由于不return,保证继续回溯搜索就好了 row[x][i] = false; col[y][i] = false; block[x / 3 * 3 + y / 3][i] = false; board[x][y] = '.'; } return ; } };
继续加油!:)
10 -
一介白丁
2019-04-02
leetcode不是可以看discuss吗
10
相似问题
leetcode37. 数独求教
回答 1
数独问题leetcode37
回答 1
对0-1背包问题递推方程的理解?
回答 2
377号组合数问题
回答 2
没有理解这道题,麻烦bobo老师赐教~
回答 1