子标题: 编程之美1.15——构造数独 
转载信息: http://blog.csdn.net/linyunzju/article/details/7673959

问题:

构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。

首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。

  1. #include<iostream>
  2. #include<cstdlib>
  3. usingnamespace std;
  4. #define LEN 9
  5. #define CLEAR(a) memset((a),0,sizeof(a))
  6. int level[]={30,37,45};
  7. int grid[LEN+1][LEN+1];
  8. int value[LEN+1];
  9. voidnext(int&x,int&y)
  10. {
  11. x++;
  12. if(x>9)
  13. {
  14. x =1;
  15. y++;
  16. }
  17. }
  18. // 选择下一个有效状态
  19. int pickNextValidValue(int x,int y,int cur)
  20. {
  21. CLEAR(value);
  22. int i, j;
  23. for(i=1; i<y; i++)
  24. value[grid[i][x]]=1;
  25. for(j=1; j<x; j++)
  26. value[grid[y][j]]=1;
  27. int u =(x-1)/3*3+1;
  28. int v =(y-1)/3*3+1;
  29. for(i=v; i<v+3; i++)
  30. for(j=u; j<u+3; j++)
  31. {
  32. value[grid[i][j]]=1;
  33. }
  34. for(i=cur+1; i<=LEN && value[i]; i++);
  35. return i;
  36. }
  37. void pre(int&x,int&y)
  38. {
  39. x--;
  40. if(x<1)
  41. {
  42. x =9;
  43. y--;
  44. }
  45. }
  46. int times =0;
  47. int main()
  48. {
  49. int x, y, i, j;
  50. x = y =1;
  51. // 深度搜索的迭代算法
  52. while(true)
  53. {
  54. times++;
  55. // 满足成功结果
  56. if(y==LEN && x==LEN)
  57. {
  58. for(i=1; i<=LEN; i++)
  59. {
  60. for(j=1; j<=LEN; j++)
  61. cout << grid[i][j]<<" ";
  62. cout << endl;
  63. }
  64. cout << times << endl;
  65. break;
  66. //pre(x, y);
  67. //times = 0;
  68. }
  69. // 满足失败结果
  70. if(y==0)
  71. break;
  72. // 改变状态
  73. grid[y][x]= pickNextValidValue(x, y, grid[y][x]);
  74. if(grid[y][x]> LEN)
  75. {
  76. // 恢复状态
  77. grid[y][x]=0;
  78. pre(x, y);
  79. }
  80. else
  81. // 进一步搜索
  82. next(x,y);
  83. }
  84. for(i=1; i<= level[2]; i++)
  85. {
  86. int ind = rand()%(LEN*LEN);
  87. grid[ind/LEN+1][ind%LEN]=0;
  88. }
  89. for(i=1; i<=LEN; i++)
  90. {
  91. for(j=1; j<=LEN; j++)
  92. cout << grid[i][j]<<" ";
  93. cout << endl;
  94. }
  95. }

转载于:https://www.cnblogs.com/mfryf/archive/2012/08/11/2633746.html

构造数独 算法及代码实现相关推荐

  1. 第1章 游戏之乐——构造数独

    构造数独 1. 问题 构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,让整个棋盘每一列.每一行以及每一个3*3的小矩阵中的数字都不重复. 2. 求解 用转置的方法生成数独数 ...

  2. 花了1晚上diy的matlab解数独算法,很好理解!

    花了1晚上diy的matlab解数独算法,很好理解! 前言 一.数独的规则 二.算法 1.思路 2.流程图 3.Matlab代码 总结 前言 老婆最近迷上了数独,还给我拍了张照片,初步了解了规则之后, ...

  3. java课程 数独 文库_通俗易懂的数独算法(java版)

    数独算法 一 知识背景 无 二 绪言 偶尔玩下休闲益智小游戏,一方面可以舒解下心情,另一方面刺激下大脑皮层.百度了一下数独的起源和概念.说了那么多,看着就累.精简一下就是数字(0-9)填充游戏.不明白 ...

  4. 匈牙利算法python代码实现以及原理图解

    匈牙利算法python代码实现以及原理图解 1.匈牙利算法python代码实现: 2.原理图解: 1.匈牙利算法python代码实现: scipy中有对应的接口scipy.optimize.linea ...

  5. 哈工大硕士生实现 11 种数据降维算法,代码已开源!

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  6. YOLO-V5 算法和代码解析系列 —— 学习路线规划综述

    目录标题 为什么学习 YOLO-V5 ? 博客文章列表 面向对象 开源项目学习方法 预备知识 项目目录结构 为什么学习 YOLO-V5 ? 算法性能:与YOLO系列(V1,V2,V3,V4)相比,YO ...

  7. FP-growth算法以及代码实现

    FP-growth算法以及代码实现 FP-growth算法介绍 FP-growth算法,它被用于挖掘频繁项集,它把数据集存储为一个叫FP树的数据结构里,这样可以更高效地发现频繁项集或频繁项对. FP树 ...

  8. 严蔚敏版数据结构(C语言版)算法实现代码

    严蔚敏版数据结构(C语言版)算法实现代码 数据结构(C语言版)代码实现 线性表 顺序表 链表 单向链表 静态链表01 静态链表02 双向循环链表 栈与队列 栈 顺序栈 进制转换 行编辑器 未完待续.. ...

  9. AHP算法MATLAB代码

    AHP算法MATLAB代码 使用方法(详情请看这个视频的2P) 数学建模算法之层次分析法详解 代码如下 (1)构造判断矩阵A (2)将下文代码复制粘贴到Matlab中即可 例如: A=[1 3 5;0 ...

最新文章

  1. 12.1简介Object类
  2. Codeforces Round #326 (Div. 2) B. Pasha and Phone C. Duff and Weight Lifting
  3. 这五个超强PPT技巧,从小白到大神的距离只差这一点!
  4. 了解前端——js需知道知识点
  5. 基于JAVA+SpringMVC+MYSQL的学生请假管理系统
  6. 海量日志收集利器 —— Flume
  7. LADRC的学习——总概
  8. nacos心跳机制重复发送原理
  9. ie工业工程,VIOOVI工时分析软件:教你一个测量工时的快捷方法
  10. Kmp算法(java)
  11. 华为ensp 交换机vlan配置
  12. qq视频转码失败怎么办_教程:如何下载舞蹈视频里面的音乐?
  13. linux软件版本管理命令update-alternatives使用详解
  14. sql 事务(Transaction)
  15. 爱情就是一物降一物——金庸教你谈恋爱
  16. php eot html,PHP eot
  17. MFC图形界面编辑工具
  18. AliOS-Things--EMW3060 (9)uart
  19. 在计算机领域做研究的一些想法
  20. 多个领域同步崛起,3D建模师竟成最后的大赢家?

热门文章

  1. 一组匹配中国大陆手机号码的正则表达式
  2. Intellij Idea非常6的10个姿势!
  3. Spring AOP,AspectJ,CGLIB 有点晕
  4. element ui 下拉列表验证无效的问题(通俗易懂)-实例讲解
  5. log4j2配置文件log4j2.xml详解
  6. 叶明哲 | 数据中心空调那点事
  7. 线上redis一般安在linux_redis的zset有多牛?请把耳朵递过来
  8. Database之SQL:SQL之over partition by开窗函数的简介、使用方法(求各班级内各自排名/求各班级内第一名/求各班级内分数递增和等案例解析)之详细攻略
  9. Py之matplotlib.pyplot:matplotlib.pyplot的plt.legend函数的简介、使用方法之详细攻略
  10. ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解