力扣

题目描述

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

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

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

提示:

board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 '.'
题目数据 保证 输入数独仅有一个解

果果念

这道题目感觉挺难的,确实难哈。上一篇做了N皇后问题,也是回溯。回溯是不是都不简单啊,今天只做了两道题目。当然,这道题目也是看了别人的思路之后写出来的,但是没有比着别人抄。我是没有想到题解的话,复杂度也会这么高。这个是很难估量的,但是最大不会超过O(9^(9*9)),啊,算不出来了。我的代码跑了40-80ms,没有别人跑的快。

下面说下我的思路和遇到的坑吧

1.基本思路很好理解,暴力暴力暴力。对一个空闲的位置,要列举1-9,不行的话,再进行回溯,和八皇后问题很像哈。

2.递归一定要及时返回,否则不可收拾。为什么这样说呢?你想,题目中已经说了答案唯一,但是如果不是bool返回的话,那么就有可能找不到正确的值,因为他会一直递归一直递归,太长了。。。这个我之前没有想到,因为之前都是所有的解。就像八皇后问题。

总体说,这道题目是当时大二的时候学长宣传算法协会的时候,为了提高我们的兴趣进行介绍的一个题目,觉得挺有趣的,也一直没有机会去写,也算是画上了一个句号吧。

加油

代码

class Solution {
public:void solveSudoku(vector<vector<char>>& board) {rowSolve(0,0,board);}//正在求解第(rowIndex,cloumnIndex)处数字,0~8//按照列优先,即先一列一列的来bool rowSolve(int rowIndex,int cloumnIndex,vector<vector<char>>& board){//找到可行解if(rowIndex==9){return true;}//查找下一行if(cloumnIndex==9){return rowSolve(rowIndex+1,0,board);}if(board[rowIndex][cloumnIndex]!='.'){return rowSolve(rowIndex,cloumnIndex+1,board);}else //if(board[rowIndex][cloumnIndex]=='.'){//满足行,列,九宫格,一次性放1个for(int i=1;i<=9;i++){if(judge(rowIndex,cloumnIndex,i,board)==true){board[rowIndex][cloumnIndex]='0'+i;if(rowSolve(rowIndex,cloumnIndex+1,board)==true){return true;}board[rowIndex][cloumnIndex]='.';}}return false;}  }//0 2 0bool judge(int r,int c,int num,vector<vector<char>>& board){//检验第r行for(int i=0;i<9;i++){if(num==board[r][i]-'0'){return false;}}//检验第c列for(int i=0;i<9;i++){if(num==board[i][c]-'0'){return false;}}//九宫格的起点 0 3 6int nineR,nineC;nineR=(r/3)*3;nineC=(c/3)*3;cout<<nineR<<" "<<nineC<<endl;for(int i=nineR;i<3+nineR;i++){for(int j=nineC;j<3+nineC;j++){if(num==board[i][j]-'0'){return false;}}}return true;}
};

leetcode37. 解数独(C++|回溯)相关推荐

  1. 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独

    一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...

  2. leetcode37. 解数独(hashmap+回溯)

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

  3. 【回溯】leetcode37.解数独

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

  4. leetcode37. 解数独

    一:论语 简而言之 就是要一视同仁 对待遇见所有的人要一个态度 二:题目 三:上码 class Solution {public:bool backstacking(vector<vector& ...

  5. 解数独 视频讲解 c++

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

  6. Leetcode困难笔记 37.解数独

    解数独,回溯法即可.从左到右,从上到下,检查每种数字是否可以放进格子,如果可以就放入,一直搜索直到解数独完成. class Solution{public:bool finish = false;bo ...

  7. LeetCode算法题11:递归和回溯-解数独

    文章目录 解数独 回溯 : 仅仅在实现方式上有区别 总结 解数独 题目链接:https://leetcode-cn.com/problems/sudoku-solver/ 题目描述:编写一个程序,通过 ...

  8. 面试题目_经典面试题目「回溯算法」解数独

    解数独,理解二维递归是关键! 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家 ...

  9. 【算法分析】回溯法解数独(九宫格)算法

    这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...

最新文章

  1. 综合布线系统设计遵循的标准和条件
  2. php本身免费是啥意思,PHP本身是否支持连接和析取?
  3. Java中常见的代码冲突
  4. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  5. Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)
  6. 【codevs5709】01背包
  7. 1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
  8. CASIA WebFace | face recognition data | 人脸识别数据集 | 云盘分享 |
  9. php 判断是否为中文,php判断是否为中文正则表达式大全
  10. JMS 消息传送模式、消息签收以及spring jmsTemplate配置
  11. 【从0开始音乐demo的制作:预计耗时15小时(二)】简单的页面
  12. 免费下载3小时学会Excel数据处理视频教程
  13. 数学----向量点积公式推导
  14. 原来这才是睿至大数据的业务拼图
  15. Study「Photoshop」:勾线图
  16. GitLab系列3 Unicorn
  17. 怎么改图片大小kb像素不变?一键快速修改jpg图片大小?
  18. 将数据库转换为word文档
  19. 为iPhone日历添加天气和农历
  20. 密码学系列之:生日攻击

热门文章

  1. DNSPod十问陆婷婷:什么是创造101背后的破圈秘诀?
  2. 思科网络安全 第六章答案
  3. 富贵论坛的发展大事记
  4. MathType转Word公式(OMML)
  5. mobile ios 判断safari浏览器
  6. go语言多版本管理工具g windows下安装使用
  7. 关于AS报 主版本 52 比 51 新, 此编译器支持最新的主版本。 建议升级此编译器 问题
  8. 如何切换中英文输入法及全角/半角?(原创)
  9. 踏板摩托车uu125更换机油过程
  10. SXS: Unable to resolve storage root for assembly directory vs2010