当前位置: 首页 > news >正文

自动生成指定特征的数独题目(未完待续)

  我中学时常填数独,好像是来自《课堂内外》杂志,倒数一二页有时候会有个数独。

  而现在,我想做个数独机,预设功能如下:用户选择特征,数独机随机生成符合此特征的一个数独。

  因为选择的特征一般来说是若干个数独共有的特征,只有极特别的特征单属于一两个数独题。

  首先可以计算一下所有的数独题目共有多少个,这个不难,毕竟每个数独只有9*9==81个格子,并且只能填入1—9这9个数字,所有数独的总量是有限的。

(设:崭新数独题已被数字占领的格子为“小黑格”;所有需要玩家来填入的格子为“大白格”;游戏过程中被玩家填入的并且已经确定正确的格子再加上小黑格,称为“大黑格”,在产生大黑格的情况下,剩余的空白格为“小白格”。设:已经被填满的数独为“数独表”。此称谓只在本文有效,便于文章理解。)

  最简单的数独类型无疑就是初始格有80个,只需要玩家填入一个数字即可,然后越难的题目小黑格越少。(当然对于题目的难易,不同的玩家有不同的标准,这里粗略地按照大白格的多少来定义。)最难的数独题,按数独的定义来说,也就是可谓“最简条件”,即这个数独题目,把其上任何一个初始数字拿掉,都将使填数过程中的逻辑推导出现断层,使解题者根本无法完成数独。但如果考虑到数字空间分布,或者是逻辑嵌套深度,最简条件态的数独们又可以被另行评估出不同的难易程度。

  也不能说出题者把几个数字随机摆到格子里就算是数独题,必须要能让玩家根据小黑格,经过正确的逻辑推导,最终能给出一个正确答案才行。因为有的情况下,小黑格的分布是不足以用来推导出大白格的。

  所以根据以上两段,数独题目的总数并非简单的把若干个1—9随便放入9*9方格中算出所有可能的组合情况,这些组合中,有一些是无法用于完成数独的,要排除掉,还有小黑格有81个(即所有格子已被填满)的情况也要排除掉(你至少要留出一个空格来给玩家吧!!“~-~”)。

  关于数独中的几个数值需要先整理一下:

  1,总共81个格

  2,每行9格互斥,每列9格互斥,每方9格互斥

  3,已完成的数独总是包含九个1,九个2,九个3,... ,九个8,九个9。

  4,据Wiki表述,数独表共有6,670,903,752,021,072,936,960个,除去具有对称变换相似性的那些,就少得多了,只剩5,472,730,538个。

  5,而最简条件态的数独题,就多得多了,原因显而易见,一个完成态数独表可以通过删减数字,生成多个最简条件数独题目。Wiki显示,某计算—(翻译版)估计共有3.10 × 1037个最简条件题目,另外加上2.55 × 1025个对称变换相似的最简条件题目。(这些数字具体怎么统计出来的下文再研究。)

  (一个表对应多个题,意味着不同的数独题可能会共有同一个答案。)

  关于数独的几个疑问也需要先整理一下:

  1,一个数度题目是否可能存在多个答案?根据网上的资料来看,出现多个答案的数独是不完善的。即标准的数独题目应该只存在一个答案。这就要求出题者限制更多的条件以防出现冗余态。

  一种方法属于“填进去”,先填一个,再填一个,直到可以用来作为一个数独题,能被完整地推导出来。先为9*9方格定义位置,可以把从左到右从上到下的每个方格依次编号,使每一个格子都有个名字,比如“22”代表第二行第二个格子。如下图:

 

 

  此方法第一步在11格(即第一行第一格)尝试填入数字1,此时会导致编号为(行内12,13,14,15,16,17,18,19以及列内21,31,41,51,61,71,81,91以及方内(3*3小方)另外四个22,23,32,33)的格子不能填入1。(需要注意的是,最后方内需要考虑的总是4个,是因为任一参照格在同方内的同行同列格总会占去方内四个格子,加上参照格,共5个,剩余方内的相关格就只剩四个。)它们不能再填1了,即是除去它们,以及已填的11格,数独内剩余60个空格中可以任取一格再次填入1(并不是说可以在60个格中任选几个都能填1,有的会排斥),但这里先不说再填1的事,说说第二步:第一步已占领11格,接下来占领12格,12格不能填1,所以可以填入其它八个,

 

  另一种方法刚好相反,“拿出来”,比如拿到一个已完成的数独,每个格都已被正确填入,然后逐步挖出一部分数字,最多挖到最简条件态,此过程中的任一状态都可以作为一个数独题。完成态数独表的生成比较简单,假设已列为参照,先算出每一列所有的排列情况,即将9个不同元素排序,共有多少种组合。很简单,P(9,9)=9!=362880。

 

  两种方法的难点及重点都在于,如何判断此时的数字分布是否已成玩成数独的充分条件。

转载于:https://www.cnblogs.com/oler/p/9644365.html

相关文章:

  • 学习python必备的学习网站
  • Linux服务器性能评估
  • Synchronized与Lock的底层实现解析
  • ES6数组的扩展----Array.from()和Array.of()
  • jdk动态代理和cglib动态代理的区别
  • 设计模式-结构型模式,python组合模式
  • webpack4学习笔记
  • 【leetcode】907. Sum of Subarray Minimums
  • rsync+shell脚本完成自动化备份
  • vlan接口及应用
  • JSP的C标签遍历Map数据
  • c#-WPF string,color,brush之间的转换
  • WPF实现滚动显示的TextBlock
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • canvas练习 - 七巧板绘制
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • centos安装java运行环境jdk+tomcat
  • JavaScript 基本功--面试宝典
  • Java到底能干嘛?
  • Java应用性能调优
  • JS专题之继承
  • Laravel 中的一个后期静态绑定
  • Linux Process Manage
  • Rancher-k8s加速安装文档
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer插入数据
  • vue-router的history模式发布配置
  • WebSocket使用
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 翻译:Hystrix - How To Use
  • 前端自动化解决方案
  • 通过几道题目学习二叉搜索树
  • 由插件封装引出的一丢丢思考
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​flutter 代码混淆
  • (1)(1.11) SiK Radio v2(一)
  • (solr系列:一)使用tomcat部署solr服务
  • (第二周)效能测试
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)【Hibernate总结系列】使用举例
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET Core中的去虚
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET连接MongoDB数据库实例教程
  • .sdf和.msp文件读取
  • /etc/skel 目录作用
  • /usr/bin/env: node: No such file or directory