c++实现数算法---假设检验法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c实现数算法---假设检验法

 HYPERLINK /halfwater/blog/item/dd067c7a6423ffe62e73b3a6.html /halfwater/blog/item/dd067c7a6423ffe62e73b3a6.html  HYPERLINK /halfwater/blog/item/d19cf301f1a50b.html \t _blank C++实现解数独算法——序 先告诉大家一个好消息,2010年上半学期,我们通院科协将与 HYPERLINK / \t _blank 中国数独联盟(sudokuchina)合作开展一系列数独竞赛,以此丰富大家的课余生活。 HYPERLINK / \t _blank 中国数独联盟是中国在国际上唯一承认的数独组织,目前他们正在推广的“数独进校园”活动也正在火热进行中。 ??????? 话归正题,由于本人时间有限,所有内容不可能一口气全部发至blog,所以这篇“C++实现数独算法”将是本人的一系列文章。它们将会与数独算法结合,循序渐进地介绍C++面向对象程序设计的一些方法和数独的技巧。由于本人水平有限,无论是数独还是C++,接触时间均不超过半年,所以如有不到之处,请各位高手予以指正。谢谢各位。 ??????? 这篇序主要讲解一下编程之前的准备工作与本人最后的成果,在以后的文章中,会陆续介绍相关算法的实现过程。 先看看成果: 原题: 程序效果图: ??????? 大家别看用了2分多,实际上时间都花在给程序输入数独数据和一个一个对着往上填答案上了,以本人的AMD Athlon X2 64,你根本反应不过来算出答案所用的时间。命令提示符中,上9行是我输入的数独,下9行就是给出的结果。大家自己也可以用手解一下这个数独,没十几分钟根本解不出来。好了,下面该说说准备工作了。 ??????? 既然要做一个能解数独的程序,首先就要玩好数独,找到其中的规律,不能因为现在计算机运算速度快,就直接让电脑一个一个“猜”,这样电脑也是会很吃不消的。在 HYPERLINK /sudoku/index.php \t _blank 中国数独联盟官方网站上,有一个“ HYPERLINK /sudoku/index.php/action-channel-name-game \t _blank 在线游戏”(点此链接直接进入),玩了几个级别的难度之后,???总结了一些技巧。 Easy难度所需技巧:排除法 根据数独的性质(每一横行、竖行、3x3中只能有1-9且不能重复),利用已知,将每个空位的可能取值一一列出。此时就会发现有些位置只能取一个值,此时就可以确定该位置的取值就为该值。循环进行此方法,就可解出所有Easy难度的数独了。 Medium难度所需技巧:独立值法(自创的名字,玩过数独的人肯定都用过) 除了排除法,Medium难度还需要我所谓的“独立值法”。就是说,在一个数独集合(1-9不能重复的9个位置的集合,比如每一横、竖、3x3所包含的9个小格所组成的集合)中,一个数字在只在其中一个位置出现了一次,而并没有在其它位置出现,那么就可以断定该数字就应填入该位置。这点应该很好理解,这里就不多说为什么了。循环利用此法与排除法,就可全解Medium难度的所有数独。 Hard难度所需技巧: 其实Hard难度就是比Medium难度稍微复杂了一些,要多动动脑筋,使用的方法都一样。 Very Hard难度所需技巧:假设检验(可能是刚学完《概率论与数理统计》的缘故) 当你循环使用排除法与独立值法共同解Very Hard难度时,发现到了一定阶段,你两种方法都已经无用武之地了,这时你就需要使用“假设检验”。其实非常好理解,你先假设一个位置为一个该位置可能的取值,以此为依据,循环使用排除与独立值法,如果能解决,那最好;如果经排除法发现有个别位置不可能填任何数,则说明假设错误,应更换假设;如果发现扔无法解决,那么不好意思,你要再对另一个位置进行假设,直到算出最后结果。 具体方法就这些,接下来的数据结构和算法部分请见后续文章。(未完待续...) C++实现解数独算法——输入与输出 ??? 简单介绍完数独后,就开始介绍C++实现的数据结构和算法了。首先先介绍数独的输入与输出,建立一个数独类。 /*sudoku.h*/ #pragma once //仅编译一次,防止重复编译 #include iostream #include bitset //使用位运算的容器模板类 using namespace std; class sudoku { ??? public: ??????? sudoku(); //构造函数,通过输入初始化数独矩阵 ??????? void display(); //输出数独

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档