欢迎来到天天文库
浏览记录
ID:44925954
大小:2.71 MB
页数:33页
时间:2019-11-05
《数学建模最终论文设计c题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Kakuro数独模型的建立求解模型包括三个重要的子模型1:建立一个数学模型对kakuro中可能出现的和数进行所有可能的拆分;2:建立一个数学模型对一个已知的kakuro求解;3:产生有唯一解的kakuro;由于第二步对kakuro的求解采用面向对象的工具软件,所以第二步和第一步是相互独立的。在第三步的产生过程中,我们只是粗略地考虑了如何产生不同等级的kakuro和保证kakuro有唯一解。对等级的划分我们还另外进行了讨论。在第三步模型的建立中要用到第一个和第二个模型。一.对Kakuro数独进行求解1.通解方法--人工试探法现在我们必须做的第一件事是考虑怎样解决Kakuro
2、。我们现在使用逻辑推理法和一点数学来解决题目要求的数模题,这里应用的方法将会被应用到我们产生kakuro的模型中。根据以下方法可以确保最终得到数独的解,而且通过手工运算的时间基本可以控制在2个小时,不论难易程度,所以此方法可以作为取得数独答案的一般解法。1、要解题,可以很快就看到提示的线索组合。以右图为例,注意左下侧的空格组里,有一个提示码4(由上往下的加总)以及提示码3(向右的加总),两回交叠的区块里标有一个“A”。332、只有1、2相加能得到3,1、3相加得到4,所以“A”只能是1、2、3其中一个数字。但是,如果放3,提示码3那一列,就会得出一个不可能的组合,即3、0
3、,如果放2,提示码4的那一列则会变成2、2相加,也算犯规。所以“A”只可能是“1”。(该情况出现的可能往往不多,除了较简单的数独题,但这是一个必要的过程,而且在随后的过程中要反复使用此方法。)依照这样的逻辑推论,如果“A”等于1,它上面的空格就是3(因为1+3=4),而它右边的空格就会是2。2上方的两个空格依此逻辑解出。相同道理,右上侧的空格组里,提示码3(由上往下加总)及提示码4(向右的加总),两回交叠的区块里标有一个“B”。跟step2的判断方式一样,所以“B”只能是“1”。依照这样的逻辑推论,如果“B”33长等于1,它下面的空格就是2(因为1+2=3),而它左边的空
4、格就会是3。3下方的空格依此逻辑解出。解开其余的谜底,就只需要简单的数字运算而已.3、审视各个横列、竖列及根据其和罗列出的可能的数字结果,若发现某一个数字在各个横列、竖列出现的次数仅一次,则可以确定该空格的解为此数字。并根据第二条的方法排除与此空格相关列或方格中相同的数字。4、审视各个横列、竖列中罗列的各个可能的结果,找出相对称的两个数组合的空格(或3个、4个及其以上个数的组合),并确定这两个空格(或3个、4个及其以上个数的组合)的数字只可能为这两个数字,即两个数字在这两个空格的位置可以交换,但不可能到该行、该列的其他位置。根据此结果可以排除相关列罗列出相关数字的可能,并
5、缩小范围。(该步骤处理的难度相对复杂,需要在积累一定经验的基础上进行,也是最终求解的关键)335、反复使用2、3、4提到的步骤,逐步得到一个一个空格的解,并将先前罗列的各种可能的结果一个一个排除,使可能的范围越来越小,直至得到最后结果。2.通过数学软件求解,建立数独问题的数学模型现在以8×10的数独图为例介绍。程序输入,一个8×10的输入矩阵.算法的主要思想如下:首先将线索格里的数据进行拆分;接着根据被拆分的数被”回”限制的个数,选出合适的组合;然后据此确定出可以确定的数;再尽量减少未定格子的变量,试探,回溯,最终求解。为了随时调用线索格里的提示码的分解组合,对于8×10
6、的数独,其每行每列数的和均小于45而大于3,建立一C语言程序将其可能的组合全部求出.33其源程序如下:#include#includelongres[1024];voidfen(longn,longm)//n是需要拆分的数,m是拆分的个数。{longrest;inti,j;for(i=1;i<=n;i++)//从1开始尝试拆分。{if(i>res[m-1])//拆分的数大于前一个,保证不重复。(第一个是0,虚拟的,不计入结果){res[m]=i;;//将这个数计入结果中。rest=n-i;//剩下的数是n-i。if(rest==0&&
7、m>1)//如果已经没有剩下的了,并且进度(总的拆分个数)大于1,说明已经得到一个结果。{for(j=1;j<=m;j++){if(res[m]<10.0)printf("%ld",res[j]);33}printf("");}else{fen(rest,m+1);//否则将剩下的数进行进度为m+1拆分。}res[m]=0;//取消本次结果,进行下一次拆分。}}}intmain(){longn;printf("Inputn:");scanf("%ld",&n);while(n>0.1&&n<45.1){memset(res
此文档下载收益归作者所有