一、题目描述

编写一个程序,通过填充空格来解决数独问题。

数独的解法需遵循如下规则:

示例一:
输入:board =
[["5", "3", ".", ".", "7", ".", ".", ".", "."],["6", ".", ".", "1", "9", "5", ".", ".", "."],[".", "9", "8", ".", ".", ".", ".", "6", "."],["8", ".", ".", ".", "6", ".", ".", ".", "3"],["4", ".", ".", "8", ".", "3", ".", ".", "1"],["7", ".", ".", ".", "2", ".", ".", ".", "6"],[".", "6", ".", ".", ".", ".", "2", "8", "."],[".", ".", ".", "4", "1", "9", ".", ".", "5"],[".", ".", ".", ".", "8", ".", ".", "7", "9"]
]
输出:
[["5", "3", "4", "6", "7", "8", "9", "1", "2"],["6", "7", "2", "1", "9", "5", "3", "4", "8"],["1", "9", "8", "3", "4", "2", "5", "6", "7"],["8", "5", "9", "7", "6", "1", "4", "2", "3"],["4", "2", "6", "8", "5", "3", "7", "9", "1"],["7", "1", "3", "9", "2", "4", "8", "5", "6"],["9", "6", "1", "5", "3", "7", "2", "8", "4"],["2", "8", "7", "4", "1", "9", "6", "3", "5"],["3", "4", "5", "2", "8", "6", "1", "7", "9"]
]

二、题解

通过回溯法求解,整体思路与N皇后问题相似,都是依次处理每个格子,同时通过一个 isValid 函数判断当前位置填充值的有效性。

同时因为题目中已经说明题目数据保证输入数独有且仅有一个解,因此我们需要让回溯函数返回值为布尔类型,这样只要遇到任意一种成功的情况,就立即依次返回。

class Solution {public:void solveSudoku(vector<vector<char>> &board) {backtracking(board, 0, 0);}private:bool backtracking(vector<vector<char>> &board, int row, int col) {if (row == board.size()) {return true;}if (board.at(row).at(col) == '.') {for (int i = 1; i <= 9; i++) {board.at(row).at(col) = static_cast<char>(i + 48);if (isValid(board, row, col)) {if (col == board.size() - 1) {if (backtracking(board, row + 1, 0)) {return true;}} else {if (backtracking(board, row, col + 1)) {return true;}}}}board.at(row).at(col) = '.';} else {if (col == board.size() - 1) {if (backtracking(board, row + 1, 0)) {return true;}} else {if (backtracking(board, row, col + 1)) {return true;}}}return false;}bool isValid(vector<vector<char>> &board, int row, int col) {char c = board.at(row).at(col);/* 检查列重复 */for (int i = 0; i < board.size(); i++) {if (board.at(i).at(col) == c && i != row) {return false;}}/* 检查行重复 */for (int j = 0; j < board.size(); j++) {if (board.at(row).at(j) == c && j != col) {return false;}}/* 检查组内重复 */for (int i = (row / 3) * 3; i < ((row / 3) + 1) * 3; i++) {for (int j = (col / 3) * 3; j < ((col / 3) + 1) * 3; j++) {if (board.at(i).at(j) == c && i != row && j != col) {return false;}}}return true;}
};

力扣 37. 解数独相关推荐

  1. 力扣Java解数独_LeetCode 力扣 37. 解数独

    题目描述(困难难度) 给定一个数独棋盘,输出它的一个解. 解法一 回溯法 从上到下,从左到右遍历每个空位置.在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后 ...

  2. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

  3. Java实现 LeetCode 37 解数独

    37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...

  4. 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结

    代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...

  5. LeetCode高频题37. 解数独

    LeetCode高频题37. 解数独 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛的 ...

  6. 算法训练day24 | php | 332.重新安排行程 , 51. N皇后 , 37. 解数独 ,总结

    一.力扣题332. 重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点.请你对该行程进行重新规划排序. 所有这些机 ...

  7. LeetCode—37. 解数独(困难)

    37. 解数独(困难) 题目描述: 编写一个程序,通过填充空格来解决数独问题. 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 ...

  8. Leetcode算法Java全解答--37. 解数独

    Leetcode算法Java全解答–37. 解数独 文章目录 Leetcode算法Java全解答--37. 解数独 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 编写一个 ...

  9. 代码随想录30——回溯:332重新安排行程、51N皇后、37解数独

    文章目录 1.332重新安排行程 1.1.题目 1.2.解答 1.2.1.思路 1.2.2.代码 2.51N皇后 2.1.题目 2.2.解答 3.37解数独 3.1.题目 3.2.解答 3.2.1.正 ...

最新文章

  1. 基于Pytorch和RDKit建立QSAR模型
  2. Java 爬虫--类似Python的requests库--HttpClient, HttpAsyncClient--Maven
  3. 说说Android桌面(Launcher应用)背后的故事(二)——应用程序的添加
  4. kafka实战最佳经验,阿里又现海王!某程序员同时约两个女生十一出游
  5. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)
  6. linux mysql 文件恢复_linux下误删数据文件恢复
  7. 设计模式-行为型模式-命令模式
  8. jsp文件里java代码的作用_如何使用JSP 2避免JSP文件中的Java代码?
  9. mysql字段命名_Mysql 01—数据库表字段的命名规则
  10. Jupyter Notebook Config
  11. DedeCMS5.5 调用当前内容页TAG标记的办法
  12. AJAX学习笔记 一:简单的XMLHTTPRequest示例和asp.net异步更新。
  13. dede php判断,织梦视频页面用PHP判断用户访问类型
  14. 计算机软件研发的相关会计分录,研发支出资本化的相关会计分录
  15. 威纶触摸屏做modbus rtu主站控制风机 ZLAN5143的应用案例
  16. 分布式数据库BLP安全模型介绍
  17. RS232通信协议详解
  18. 尤雨溪-写一个mini vue
  19. 《数字图像处理》学习总结及感悟:第二章数字图像基础(4)像素间的关系
  20. matlab绘图笔记

热门文章

  1. Easyx进阶(二)
  2. git revert回滚代码
  3. mysql limit 算法_MySQL的limit用法及优化(转)
  4. com.huawei.android,Android 集成、接入华为登陆和华为支付
  5. 豌豆荚手机精灵试用测试
  6. gstreamer使用总结
  7. storyboard设置控件的长宽比和控件之间的尺寸成比例
  8. 运动耳机哪个牌子耐用、公认结实耐用的运动耳机
  9. nyoj-722 数独(深搜,哈希)
  10. 36.Python实现马尔科夫链