leetcode37. 解数独(C++|回溯)
力扣
题目描述
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 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++|回溯)相关推荐
- 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独
一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...
- leetcode37. 解数独(hashmap+回溯)
编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...
- 【回溯】leetcode37.解数独
题目: 编写一个程序,通过填充空格来解决数独问题. 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x ...
- leetcode37. 解数独
一:论语 简而言之 就是要一视同仁 对待遇见所有的人要一个态度 二:题目 三:上码 class Solution {public:bool backstacking(vector<vector& ...
- 解数独 视频讲解 c++
题目描述 编写一个程序,通过填充空格来解决数独问题. 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以 ...
- Leetcode困难笔记 37.解数独
解数独,回溯法即可.从左到右,从上到下,检查每种数字是否可以放进格子,如果可以就放入,一直搜索直到解数独完成. class Solution{public:bool finish = false;bo ...
- LeetCode算法题11:递归和回溯-解数独
文章目录 解数独 回溯 : 仅仅在实现方式上有区别 总结 解数独 题目链接:https://leetcode-cn.com/problems/sudoku-solver/ 题目描述:编写一个程序,通过 ...
- 面试题目_经典面试题目「回溯算法」解数独
解数独,理解二维递归是关键! 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家 ...
- 【算法分析】回溯法解数独(九宫格)算法
这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...
最新文章
- 综合布线系统设计遵循的标准和条件
- php本身免费是啥意思,PHP本身是否支持连接和析取?
- Java中常见的代码冲突
- 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
- Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)
- 【codevs5709】01背包
- 1.线性回归、梯度下降法、岭回归、LASSO回归、最小二乘法
- CASIA WebFace | face recognition data | 人脸识别数据集 | 云盘分享 |
- php 判断是否为中文,php判断是否为中文正则表达式大全
- JMS 消息传送模式、消息签收以及spring jmsTemplate配置
- 【从0开始音乐demo的制作:预计耗时15小时(二)】简单的页面
- 免费下载3小时学会Excel数据处理视频教程
- 数学----向量点积公式推导
- 原来这才是睿至大数据的业务拼图
- Study「Photoshop」:勾线图
- GitLab系列3 Unicorn
- 怎么改图片大小kb像素不变?一键快速修改jpg图片大小?
- 将数据库转换为word文档
- 为iPhone日历添加天气和农历
- 密码学系列之:生日攻击
热门文章
- DNSPod十问陆婷婷:什么是创造101背后的破圈秘诀?
- 思科网络安全 第六章答案
- 富贵论坛的发展大事记
- MathType转Word公式(OMML)
- mobile ios 判断safari浏览器
- go语言多版本管理工具g windows下安装使用
- 关于AS报 主版本 52 比 51 新, 此编译器支持最新的主版本。 建议升级此编译器 问题
- 如何切换中英文输入法及全角/半角?(原创)
- 踏板摩托车uu125更换机油过程
- SXS: Unable to resolve storage root for assembly directory vs2010