解数独

题目链接:力扣题目链接
难度:困难
编写一个程序,通过填充空格来解决数独问题。

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

示例 :

输入: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”]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

思路

解数独的递归函数的返回值需要用boolean类型,因为解数独找到一个符合的条件(假设树的叶子节点)就立刻返回,相当于找从根节点到叶子节点的一条唯一路径,所以需要boolean类型。
解数独需要“遍历整个树型结构寻找可能的叶子节点就立刻返回”,递归的下一层的棋盘一定要比上一层棋盘多一个数,等数填满了棋盘自然就终止了,所以不需要终止条件。
使用一个for循环遍历行,一个for循环遍历列,一行一列确定下来,递归遍历这个位置放9个数字的可能性。
判断棋盘是否合法的三个条件:1.同行是否重复,同列是否重复,9宫格里是否重复。

回溯代码

class Solution{public void solveSudoku(char[][] board) {backTracking(board);}public boolean backTracking(char[][] board){//一个for循环遍历棋盘的行 一个for循环遍历棋盘的列for(int i = 0;i<9;i++){//行for(int j = 0;j<9;j++){//列if(board[i][j]!='.'){//跳过原始数字continue;  }   // 一行一列确定下来之后,递归遍历这个位置放9个数字的可能性for(char k='1';k<='9';k++){//i,j这个位置放k合适不合适if(isValidShudu(i,j,k,board)){board[i][j] = k;if(backTracking(board)){//如果找到一组就立刻返回return true;}board[i][j] = '.';}}//9个数都找完了 还没有合适的说明无解//直接返回后 就不会无线递归下去了return false;}}//遍历完没有返回false 说明找到合适棋盘的位置了return true;}/*判断棋盘是否合法有三个条件:1.同行是否重复2.同列是否重复3.9宫格是否重复*/private boolean isValidShudu(int row,int col,int val,char[][] board){//同行是否重复for(int i=0 ; i<9; i++){if(board[row][i] == val){return false;}  }//同列是否重复for(int i=0 ; i<9; i++){if(board[i][col] == val){return false;}}//9宫格里是否重复int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for(int i = startRow; i<startRow +3;i++){for(int j = startCol; j<startCol + 3;j++){if(board[i][j]==val){return false;}}  }return true;}
}

算法学习:37. 解数独相关推荐

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

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

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

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

  3. 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

    代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...

  4. 代码随想录算法训练营第三十天| 第七章 回溯算法:332.重新安排行程,51.N皇后,37.解数独(python)

    回溯算法总结 332.重新安排行程 讲解链接 class Solution:def __init__(self):self.res = []self.dict = defaultdict(list)d ...

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

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

  6. LeetCode高频题37. 解数独

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

  7. 代码随想录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.正 ...

  8. 代码随想录【Day 30】| 332.重新安排行程 、51. N皇后 、37. 解数独

    代码随想录[Day 30] | 332.重新安排行程 .51. N皇后 .37. 解数独 332.重新安排行程 题目链接:332.重新安排行程 卡尔文解 解题思路及注意事项: 代码实现: 51. N皇 ...

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

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

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

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

最新文章

  1. Python Matplotlib.pyplot 中文显示异常的简单解决方法
  2. 【数学和算法】初识卡尔曼滤波器(四)
  3. 获得供应商最近一次报价:OVER(PARTITION BY)函数用法的实际用法
  4. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战
  5. Angular之ngx-permissions的常见使用情况
  6. apollomq mysql_Apollo 配置中心安装使用
  7. linux过滤端口抓包_TCP 协议三次握手抓包分析amp;查看状态
  8. Greenplu数据库的部署
  9. 文本编辑器(Editor)and 文件上传功能
  10. html站点文件命名规范,HTML制作中的文件夹及文件命名规范(二)
  11. oracle+soacs,第 3 章 使用 C++ 编译器选项
  12. 今有物不知其数三三数之JAVA_今有物不知其数.三三数之剩二.五五数之剩三.七七数之剩二.问物几何? 题目和参考答案——青夏教育精英家教网——...
  13. EfficientNetV2网络详解
  14. 计算机专业 大学物理课程简介,大学物理A课程简介.doc
  15. Dart学习3、数据类型详解
  16. Oracle数据库后端优化建议
  17. NATAPP内网穿透工具使用说明
  18. 判断三个参数是否能构成一个三角形
  19. Android Studio-- Android模拟器上启用互联网(WLAN/移动网络)
  20. sqlserver用sql语句来进行外键约束的修改

热门文章

  1. 小米智能互联App__电脑发文件到手机超时错误解决办法
  2. CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法
  3. google hosts 设置
  4. 这些你心念念的异步新书,终于上市啦!
  5. python开发人工智能机器人_Python人工智能?
  6. jenkins 邮件抄送
  7. CVX用户指南之DCP规则集
  8. quickpcb添加pcb库_quickpcb2005详细步骤教程
  9. 稳定支撑千万级月活,华为日历背后的英雄
  10. 《无尽战神》iOS版预下载开启!