构造数独 算法及代码实现
子标题: 编程之美1.15——构造数独
转载信息: http://blog.csdn.net/linyunzju/article/details/7673959
问题:
构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。
首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。
- #include<iostream>
- #include<cstdlib>
- usingnamespace std;
- #define LEN 9
- #define CLEAR(a) memset((a),0,sizeof(a))
- int level[]={30,37,45};
- int grid[LEN+1][LEN+1];
- int value[LEN+1];
- voidnext(int&x,int&y)
- {
- x++;
- if(x>9)
- {
- x =1;
- y++;
- }
- }
- // 选择下一个有效状态
- int pickNextValidValue(int x,int y,int cur)
- {
- CLEAR(value);
- int i, j;
- for(i=1; i<y; i++)
- value[grid[i][x]]=1;
- for(j=1; j<x; j++)
- value[grid[y][j]]=1;
- int u =(x-1)/3*3+1;
- int v =(y-1)/3*3+1;
- for(i=v; i<v+3; i++)
- for(j=u; j<u+3; j++)
- {
- value[grid[i][j]]=1;
- }
- for(i=cur+1; i<=LEN && value[i]; i++);
- return i;
- }
- void pre(int&x,int&y)
- {
- x--;
- if(x<1)
- {
- x =9;
- y--;
- }
- }
- int times =0;
- int main()
- {
- int x, y, i, j;
- x = y =1;
- // 深度搜索的迭代算法
- while(true)
- {
- times++;
- // 满足成功结果
- if(y==LEN && x==LEN)
- {
- for(i=1; i<=LEN; i++)
- {
- for(j=1; j<=LEN; j++)
- cout << grid[i][j]<<" ";
- cout << endl;
- }
- cout << times << endl;
- break;
- //pre(x, y);
- //times = 0;
- }
- // 满足失败结果
- if(y==0)
- break;
- // 改变状态
- grid[y][x]= pickNextValidValue(x, y, grid[y][x]);
- if(grid[y][x]> LEN)
- {
- // 恢复状态
- grid[y][x]=0;
- pre(x, y);
- }
- else
- // 进一步搜索
- next(x,y);
- }
- for(i=1; i<= level[2]; i++)
- {
- int ind = rand()%(LEN*LEN);
- grid[ind/LEN+1][ind%LEN]=0;
- }
- for(i=1; i<=LEN; i++)
- {
- for(j=1; j<=LEN; j++)
- cout << grid[i][j]<<" ";
- cout << endl;
- }
- }
转载于:https://www.cnblogs.com/mfryf/archive/2012/08/11/2633746.html
构造数独 算法及代码实现相关推荐
- 第1章 游戏之乐——构造数独
构造数独 1. 问题 构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,让整个棋盘每一列.每一行以及每一个3*3的小矩阵中的数字都不重复. 2. 求解 用转置的方法生成数独数 ...
- 花了1晚上diy的matlab解数独算法,很好理解!
花了1晚上diy的matlab解数独算法,很好理解! 前言 一.数独的规则 二.算法 1.思路 2.流程图 3.Matlab代码 总结 前言 老婆最近迷上了数独,还给我拍了张照片,初步了解了规则之后, ...
- java课程 数独 文库_通俗易懂的数独算法(java版)
数独算法 一 知识背景 无 二 绪言 偶尔玩下休闲益智小游戏,一方面可以舒解下心情,另一方面刺激下大脑皮层.百度了一下数独的起源和概念.说了那么多,看着就累.精简一下就是数字(0-9)填充游戏.不明白 ...
- 匈牙利算法python代码实现以及原理图解
匈牙利算法python代码实现以及原理图解 1.匈牙利算法python代码实现: 2.原理图解: 1.匈牙利算法python代码实现: scipy中有对应的接口scipy.optimize.linea ...
- 哈工大硕士生实现 11 种数据降维算法,代码已开源!
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...
- YOLO-V5 算法和代码解析系列 —— 学习路线规划综述
目录标题 为什么学习 YOLO-V5 ? 博客文章列表 面向对象 开源项目学习方法 预备知识 项目目录结构 为什么学习 YOLO-V5 ? 算法性能:与YOLO系列(V1,V2,V3,V4)相比,YO ...
- FP-growth算法以及代码实现
FP-growth算法以及代码实现 FP-growth算法介绍 FP-growth算法,它被用于挖掘频繁项集,它把数据集存储为一个叫FP树的数据结构里,这样可以更高效地发现频繁项集或频繁项对. FP树 ...
- 严蔚敏版数据结构(C语言版)算法实现代码
严蔚敏版数据结构(C语言版)算法实现代码 数据结构(C语言版)代码实现 线性表 顺序表 链表 单向链表 静态链表01 静态链表02 双向循环链表 栈与队列 栈 顺序栈 进制转换 行编辑器 未完待续.. ...
- AHP算法MATLAB代码
AHP算法MATLAB代码 使用方法(详情请看这个视频的2P) 数学建模算法之层次分析法详解 代码如下 (1)构造判断矩阵A (2)将下文代码复制粘贴到Matlab中即可 例如: A=[1 3 5;0 ...
最新文章
- 12.1简介Object类
- Codeforces Round #326 (Div. 2) B. Pasha and Phone C. Duff and Weight Lifting
- 这五个超强PPT技巧,从小白到大神的距离只差这一点!
- 了解前端——js需知道知识点
- 基于JAVA+SpringMVC+MYSQL的学生请假管理系统
- 海量日志收集利器 —— Flume
- LADRC的学习——总概
- nacos心跳机制重复发送原理
- ie工业工程,VIOOVI工时分析软件:教你一个测量工时的快捷方法
- Kmp算法(java)
- 华为ensp 交换机vlan配置
- qq视频转码失败怎么办_教程:如何下载舞蹈视频里面的音乐?
- linux软件版本管理命令update-alternatives使用详解
- sql 事务(Transaction)
- 爱情就是一物降一物——金庸教你谈恋爱
- php eot html,PHP eot
- MFC图形界面编辑工具
- AliOS-Things--EMW3060 (9)uart
- 在计算机领域做研究的一些想法
- 多个领域同步崛起,3D建模师竟成最后的大赢家?
热门文章
- 一组匹配中国大陆手机号码的正则表达式
- Intellij Idea非常6的10个姿势!
- Spring AOP,AspectJ,CGLIB 有点晕
- element ui 下拉列表验证无效的问题(通俗易懂)-实例讲解
- log4j2配置文件log4j2.xml详解
- 叶明哲 | 数据中心空调那点事
- 线上redis一般安在linux_redis的zset有多牛?请把耳朵递过来
- Database之SQL:SQL之over partition by开窗函数的简介、使用方法(求各班级内各自排名/求各班级内第一名/求各班级内分数递增和等案例解析)之详细攻略
- Py之matplotlib.pyplot:matplotlib.pyplot的plt.legend函数的简介、使用方法之详细攻略
- ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解