leetcode 37 数独问题的解答

1.问题 请写一个程序来解决数独难题。
数独解决方案应该遵循以下三个规则:
1.每个数字1-9只能在每行中出现一次。
2.每个数字1-9只能在每列中出现一次。
3.每个数字1-9只能在网格的每个3x3子框中出现一次。
2.要求
·空格字符表示一个空的单元格。
·拼图板是一个长度为9的方阵
·保证输入板只有一个解决方案。
3.算法核心思想
本道题的思想和n皇后是比较相似,可以类比的是n皇后是在每一行,每一列,和两个斜 对角线上是有冲突的,数独是在每一列,每一行以及每个33的小方格当中是冲突的,而且在做算法的过程中都可以通过行优先的方式进行回溯,但是两个也有不同的地方,其中一点就 是n皇后在每一行只放置一个,但是数独是每一个位置都放置1-9的不同的数字。 在本道题当中,我使用的是通过行优先的方式,从一个矩阵的[0][0]位置开始,首先判断 在给出的数组当中这个位置是否是空格(即没有数字),如果没有数字,那么就从1-9逐一放 置数字,比如当我放置了一个1,于此同时,我要判断我放置的这个1是否能够满足我的每一 行每一列以及每个33的小方格上是否满足没有1,如果有1,那么就重新找2,如果2满足情 况,那么就是在这个位置上填2的基础上,在这一行上填其他的数字,如果填着填着发现在2 的基础上填这一行上的数字始终有不对的地方,那么进行返回,一直返回到刚刚填2的那个位 置,重新在这个位置上尝试3,以此类推,继续这样执行,如果发现,在某一行都填不出数字, 那么这个数独返回false无解,如果我的一行可以成功的填入数字,那么就是进行递归到下一 行再次重复上述的操作,直到进行到我的每一行都填完数字为止,当然如果不满足情况,那 么就是这个数独无解

分享代码

#include<iostream>
#include<vector>
using namespace std;class solvesudoku //建立一个专门解决此类问题的类
{public:bool Bactrack(vector<vector<char>>& board,int row,int col);//这是一个回溯函数bool isValid(vector<vector<char>>& board, int row, int col,char ch);//判断这个数字在行,列以及每个小方格上是否重复
};
bool solvesudoku::Bactrack(vector<vector<char>>& board, int row, int col) {if (col == 9)//列为9,换到下一行return Bactrack(board, row + 1, 0);if (row == 9)//行为9,说明已经结束,回溯成功,数独有解return true;//从第0行第0列开始进行回溯for (int i = row; i < 9; i++) {for (int j = col; j < 9; j++){if (board[i][j] != ' ')  //如果上面有数字,则跳到下一列return Bactrack(board, i, j + 1);for (char ch = '1'; ch <='9'; ch++) //在这个方格当中对数字都进行一次尝试{if (!isValid(board, i, j, ch))//每次填入一个数字就对这个数字进行判断continue;board[i][j] = ch;//如果判断成功,那么就填入这个数字if (Bactrack(board, i, j + 1))//判断成功的同时对这个位置的下一列进行判断,看看在这个数的基础上,这一行是否都成立return true;board[i][j] = ' ';//如果不成立,回溯换数字}return false;//如果这一行都回溯不成功,那么这个数独是无解的,返回错误}}return false;
}
bool solvesudoku::isValid(vector<vector<char>>& board, int row, int col, char ch) {for (int i = 0 ; i < 9; i++) {if (board[row][i] == ch)//这一行上是否有相等的return false;if (board[i][col] == ch)//这一列上是否有相等的return false;if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == ch)//在分块的小方格上是否有相同的return false;}return true;
}
int main() {vector<vector<char>> vec;//设一个二维的数组solvesudoku Solution;vector<char>v;// 一维数组char tem;//方便提取输入的字符cout << "Input:" << endl;for (int i = 0; i < 9; i++){v.clear();//进行一行的清除for (int j = 0; j < 9; j++){while (1) {tem = getchar();if (tem >= '1' && tem <= '9' || tem == ' ')break;}v.push_back(tem);//压入一维数组}vec.push_back(v);//把一维数组压入二维数组}cout << endl;if (Solution.Bactrack(vec, 0, 0)) //带入函数当中,如果函数返回值为真,就输出这个结果{cout << "Output:" << endl;cout << endl;cout << "[";for (int i = 0; i < 9; i++) {cout << "[";for (int j = 0; j < 9; j++){if(j!=8)cout << "\"" << vec[i][j] << "\",";elsecout << "\"" << vec[i][j] << "\" ";}cout << "],";if(i!=8)cout << endl;}cout << "]";}else //如果返回值假,就输出error表示这个数独无解{cout << "error";}system("pause");
}

运行结果

leetcode 37 数独问题的解答相关推荐

  1. LintCode 802. 数独(回溯)/ LeetCode 37. 解数独

    1. 题目 编写一个程序,通过填充空单元来解决数独难题. 空单元由数字0表示. 你可以认为只有一个唯一的解决方案. LeetCode 37 题类似,把 int 改成 char,注意转换 2. 解题 行 ...

  2. 【DFS + backtrack】LeetCode 37. Sudoku Solver

    LeetCode 37. Sudoku Solver Solution1: 转载自花花酱:http://zxi.mytechroad.com/blog/searching/leetcode-37-su ...

  3. Java实现 LeetCode 37 解数独

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

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

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

  5. Leetcode 37:解数独(超详细的解法!!!)

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

  6. leetcode 37. 解数独 思考分析

    目录 题目 核心思路的不断细化 1.核心框架 2.考虑到每个位置的工作 3.考虑到到达最后一列.该位置的数已经预置的情况 4.判断是否符合规则的函数 5.确定递归终止条件+确定函数返回值 AC代码 题 ...

  7. LeetCode 37 解数独

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

  8. LeetCode 37. 解数独 Sudoku Solver

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

  9. LeetCode 37. 解数独

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

最新文章

  1. 重磅!Elasticsearch 8 正式发布!
  2. 英语什么意思_“你什么意思”用英语怎么说?千万不要说成“What#39;s your meaning?”...
  3. PHP连接Mysql数据实现增上改查
  4. javaScript获取url中的参数
  5. 一、PHP基础——表单传值、上传文件
  6. NAR | ZKSCAN3延缓人干细胞衰老的表观遗传机制
  7. python第三方库文件传输_Python第三方库在Excel文件读写中的应用
  8. codeforces 112APetya and Strings(字符串水题)
  9. android获取运行应用程序,Android中获取正在运行的应用程序
  10. 定义斜体文本的html标签,HTML 文本格式化
  11. 有行统计项和列统计项的行列转换,以及EXCEL导入SQL的简单应用
  12. 如何用EasyRecovery找回删除的文档(附注册机下载地址)
  13. 了解分布式系统和分布式系统中需要掌握的痛点
  14. 【图文详解】RE文件管理器手工精简Android系统
  15. 券商股票程序化交易接口(转)
  16. SQL中计算字符串的长度函数
  17. php choose handler,Guzzle 源码分析
  18. 小学计算机画线反思,画线段图解决问题教学反思
  19. 湖南北云科技有限公司2023届校园招聘简章
  20. 关于include的正确理解和用法

热门文章

  1. PTX-PEG-TCO 紫杉醇-聚乙二醇-反式环辛烯
  2. Arduino + Lcd1602 显示当前环境温度
  3. java8之日期、时间
  4. java android时间工具类 week 月年
  5. 【java】Eclipse使用
  6. word转换成excel导致身份证错乱的解决办法
  7. 图像处理-图像金字塔
  8. 《水经注地图服务》数据源说明
  9. 静态网页如何上传附件
  10. Allegro-PCB自定义快捷键设置和常用键盘命令