- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Kakuro数独问题091122 文彬多091148 唐龙092616 路驰090915 吕灵卓摘要数独的历史可以追溯到1783年,瑞士数学家欧拉发明了一种当时称作“拉丁方块”(Latin Square)的游戏,这个游戏是一个n×n的数字方阵,每一行和每一列都是由不重复的n个数字或者字母组成的。后被称为Sudoku数独。当大家还在钻研Sudoku数独,究竟填写1至9这几个数字的窍门时,另一个相类似的游戏于最近迅速火爆,这就是Kakuro。Kakuro在英美等地人气急升,它的好玩之处在于既有Sudoku的逻辑推理,还多了加数运算。本文主要通过建立数学求解模型解决Kakuro数独的解法,以及相关问题。主要包括以下几个问题:建立数学模型,编写MatLab程序求解Kakuro数独;算法复杂性讨论;为Kakuro数独问题划分级别,给出一种划分方式;产生不同级别且有唯一解的Kakuro数独。问题背景Kakuro数独游戏规则:在空格中填入数字1-9,数字0不能出现;带斜线的方格,斜线上方的数字等于该方格右面对应的一组水平空格里的数字之和;斜线下方的数字,等于该方格下面对应一组垂直空格里的数字之和;同一数字在每组水平(垂直)空格里只能出现一次。问题分析和模型建立1、建立数学模型,编写MatLab程序求解Kakuro数独考虑到Kakuro数独对横向和纵向的加和都有要求,且交叉点为同一个数,所以我们考虑到将要求简化,如果纵向没有任何要求,那么就简单多了。简化后就变成了如下两个问题:在空格中填入数字1-9,数字0不能出现;每个格里的数字等于该方格右面对应的一组水平空格里的数字之和;同一数字在每组水平空格里只能出现一次,垂直空格中的数字无要求34215629261315111017157同样道理,如果横向没有要求,竖向要求加和,则得到如下问题:在空格中填入数字1-9,数字0不能出现;每个格里的数字等于该方格下面对应的一组垂直空格里的数字之和;同一数字在每组垂直空格里只能出现一次,水平空格中的数字无要求21622732138616233313按照以上简化,只要两个问题的解是相同的即对应的空白格中的数字完全相同,则就是Kakuro数独的解。那么下面的问题就是如何解上面的两种数独:由于垂直(水平)方向上没有数字不相等的要求,那么就可以单独拿出一行(一列)求解即可。例如:第三行343=1+2; 2+1;4=1+3; 3+1;将不需要填写的格子和有已知条件数字的格子表示成Inf,则该行可以表示成4种行向量:(InfInf1 2 Inf 1 3InfInfInf);(InfInf2 1 Inf 1 3InfInfInf);(InfInf1 2 Inf 3 1InfInfInf);(InfInf2 1 Inf 3 1InfInfInf)。按此方法去解其它行(列),再合并成矩阵其中空格表示需要填数字的格子。根据此法可得到两个矩阵a,b(一个是根据行算出的,另一个是根据列算出的),如果两个矩阵则该矩阵就是Kakuro数独的解。但是矩阵a和矩阵b都有很多种可能,下面的问题就是根据任意一个Kakuro数独问题得出所有的矩阵a和所有的矩阵b,然后进行比较。要得到所有的矩阵a和矩阵b,由于矩阵a中垂直方向上的数字无要求,矩阵b中水平方向上的数字无要求,所以只要求出所有的行可能的结果和所有的列可能的结果然后进行循环组合即可。因此我们编了一个程序函数z=paixu(a),(附录),该函数的作用是输入任何一行或列的任何初始条件,均能得到一行或列的所有可能解。然后将所有可能解组成矩阵,进行比较(即穷举法),得出矩阵。2、算法复杂性讨论经过计算发现,该方法只是理论上可能,实际运行时需要很长时间,原因是每一行都有很多种可能,假设为n,组成矩阵a就有种可能,同样道理,矩阵b也有种可能,再将矩阵a和矩阵b进行比较就要进行次比较,所以计算时间非常长,大大超出了我们可以接受的范围。简化问题,缩短时间:记矩阵a的第i行为,矩阵b的第j列为,编写一个程序,对矩阵a中的行的所有可能的行向量进行循环,如果矩阵a中的第i行中的第j个数,在矩阵b中的所有可能的第j列中没有这个数,则将这个行向量删除。同样道理,相反的对矩阵b中的列的所有可能的列向量进行循环,如果矩阵b中的第j列中的第i个数,在矩阵a中的所有可能的第i行中没有这个数,则将这个列向量删除。这样一来,循环次数明显减少,但是仍然没减少到能够计算的数量级。于是,类似于“八皇后”问题的原理,我们又编写了另一个递归求解函数:该函数的大体思路如下:对矩阵a中第n(从1开始)行的第m(从1开始)种可能,判断矩阵b中第i()列的第n个元素是否与矩阵a中第n行的第i个元素相等,若相等,保留这一种可能,并进行步骤2。若i 不能取遍1到10,则令,重复进行步骤1。若,
原创力文档


文档评论(0)