大学时,对数独比较有一点兴趣,后来参加了一次学校组织的数独比赛,可惜结果不佳。最后本程序猿不服,突发奇想,准备自己写一个程序,解决数独问题。

思路也很简单,遍历,每碰到一个空位,则从1到9逐个试探,填完之后先判定所填数字是否有效,然后判断新填完后的数独是否可解。

先来一个函数,判断数独是否有效。代码如下

/*
检测一个数独是否有效,即在行,列,或小九宫格中出现重复数字,空位用-1代替
*/
//bool used[9] 用于记录数字是否出现过
//辅助函数,检测一个数字是否出现过
bool ChechNum(const int num, bool used[9]) {              //没出现过返回true,否则返回falseif (num == -1) return true;if (used[num - 1]) return false;else {used[num - 1] = true;return true;}
}bool IsSudoValid(vector<vector<int>>& board) {bool used[9];for (int i = 0; i < 9; ++i) {fill(used, used + 9, false);                 //初始化辅助数组for (int j = 0; j < 9; ++j) {                //检查行if (!ChechNum(board[i][j], used))return false;}fill(used, used + 9, false);for (int j = 0; j < 9; ++j) {                //检测列if (!ChechNum(board[j][i], used))return false;}}for(int r=0;r<3;++r)                             //检查九个小九宫格for (int c = 0; c < 3; ++c) {                //c,j,代表数列;r,i代表行fill(used, used + 9, false);for (int i = 3 * r; i < r * 3+3; ++i)for (int j = 3 * c; j < c * 3+3; ++j)if (!ChechNum(board[i][j], used))return false;}return true;
}

再来一个函数,判断位置(x,y)所填的数,是否合法

//检测位置(x,y)是否合法
bool isVliad(vector<vector<int>>& board, int x, int y) {for (int row = 0; row < 9; ++row) {                        //检查y列if (row != x && board[row][y] == board[x][y])return false;}for (int col = 0; col < 9; ++col) {                       //检查x行if (col != y && board[x][col] == board[x][y])return false;}for (int row = 3 * (x / 3); row < 3 * (x / 3 + 1); ++row)for (int col = 3 * (y / 3); col < 3 * (y / 3 + 1); ++col)if ((row != x || col != y) && board[row][col] == board[x][y])return false;return true;
}

最后一个函数,求解数独

bool solveSudoKu(vector<vector<int>>& sudo) {for (int row = 0;row < 9; ++row) for (int col = 0; col < 9; ++col) {if (sudo[row][col] == -1) {for (int i = 1; i < 10; ++i) {sudo[row][col] = i;if (isVliad(sudo,row,col) && solveSudoKu(sudo))return true;sudo[row][col] = -1;}return false;}}return true;
}

验证函数

void test() {vector<vector<int>> suDoKu;suDoKu.push_back({  5, 3,-1, -1, 7,-1, -1,-1,-1 });suDoKu.push_back({  6,-1,-1,  1,-1, 5, -1,-1,-1 });suDoKu.push_back({ -1, 9, 8, -1,-1,-1, -1, 6,-1 });suDoKu.push_back({  8,-1,-1, -1, 6,-1, -1,-1, 3 });suDoKu.push_back({  4,-1,-1,  8,-1, 3, -1,-1, 1 });suDoKu.push_back({  7,-1,-1, -1, 2,-1, -1,-1, 6 });suDoKu.push_back({ -1, 6,-1, -1,-1,-1,  2, 8,-1 });suDoKu.push_back({ -1,-1,-1,  4, 1, 9, -1,-1, 5 });suDoKu.push_back({ -1,-1,-1, -1, 8,-1, -1, 7, 9 });if(IsSudoValid(suDoKu)){cout << "数独有效!" << endl;}else {cout << "数独无效!" << endl;}solveSudoKu(suDoKu);for (auto vec : suDoKu) {for (auto value : vec)printf("%2d\t", value);printf("\n");}
}

最终执行test()函数即可得出结果。如图所示

c/c++ 求解数独相关推荐

  1. python图像数独_Python图像识别+KNN求解数独的实现

    Python-opencv+KNN求解数独 最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s. 整体思路大概就是识别出图中数字生成list,然后求解. 输入输出demo 数独 ...

  2. 求解数独难题, Sudoku问题(回溯)

    Introduction : 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 ...

  3. 软工个人项目之生成和求解数独

    软工个人项目之生成和求解数独 在这次完成个人项目的过程中,我第一次尝试了写csdn博客,用vs进行性能分析,在vs里面写单元测试,这次收获了很多.虽然还有很多需要改进的地方,但我会做得越来越好的~ 1 ...

  4. 求解数独的C++实现

    求解数独的C++实现 动机 在做数独的时候,抱着好奇心想做一个数独求解的程序. 当时我并没有接触多少算法,也是抱着试试看的心态编写了这个数独求解器. 解数独的方法 要写一个求解数独的程序,必须要线弄清 ...

  5. 程序设计-求解数独(C)

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /** 求解数独.* 注:空白格用0表示.** So ...

  6. 【Numpy】用Python求解数独

    目录 [题目]列出如下数独问题的2种数学模型,分析两种模型的优缺点,并用Excel求解,将结果填上.这里用Python进行求解: 一.代码 model1 二.代码 model2 三.求解结果 [题目] ...

  7. 利用python,求解数独

    import numpy as np import time time1 = time.time() '''整体灵感就是1 求出每个数字为0的位置可以填的数,并将其位置和能填的数分别以key和valu ...

  8. 数独解题思路——求解数独

    求解数独过程用到了DLX(Dancing Links)算法,算法的基础是回溯算法,主要用于解决精准覆盖问题. 回溯法及假设当前位置的数字,然后往下一个位置进行,直到进行到某一个位置时发现无论如何也找不 ...

  9. 回溯法求解数独问题(最简单,通俗易懂,附C++代码)

    问题描述:数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个九宫格内的数字均含1-9,不重复 要求:设计算法随机生成不同 ...

最新文章

  1. Beta冲刺随笔集合
  2. [Oracle]Oracle 各产品的 生命周期
  3. docker容器的构建
  4. PHP 设计模式 笔记与总结(8)策略模式
  5. spring项目属性注入和bean管理xml 注入一般属性和集合属性
  6. php性能优化分析工具XDebug 大型网站调试工具
  7. Linux平台上SQLite数据库教程(一)——终端使用篇
  8. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)
  9. Web开发中实用小工具
  10. python与线性代数 矩阵方程
  11. 云端服务器只能查看文件,云端服务器只能查看文件夹
  12. 列表生成式、生成器表达式、模块导入
  13. 分区助手磁盘移动毁我双系统
  14. Linux 网络通讯 : smbd 命令详解
  15. 买房贷款月供怎么算?贷款利息是多少?
  16. 国产最低功耗MCU使用分析
  17. AMD、ARM、Intel、Qualcomm
  18. Simulink文件命名问题
  19. 一次就让你学懂java运算符
  20. c语言图形学三角形平移,MFC怎么对所画几何图形进行旋转、填充、放缩???(急用)【...

热门文章

  1. c语言字母是怎么存储,C语言之数据在内存中的存储
  2. 一阶电路暂态响应的结果分析。_第八讲 线性电路的过渡过程分析二
  3. 内存马涉及基础知识整理
  4. Android 蓝牙/wifi云打印机 ESC/POS热敏打印机打印(ESC/POS指令篇)
  5. 电子电路:电流镜电路
  6. Android系统中固件崩溃后使用uevent机制重新加载固件 流程分析
  7. TOP100summit:【分享实录】京东1小时送达的诞生之路
  8. 爬虫技术(05)神箭手爬虫回调函数
  9. python牛顿法算立方根_Exercise 1.8 牛顿法求立方根
  10. 华为老员工谈华为终端的来龙去脉