本次个人项目是要求生成1e6个数独终局。 首先说说数独的规则,数独的棋盘是一个9×9的格图,每3×3又是一个9宫格。 数独的要求是每行、每列、每个9宫格中,1~9这9个数字必须出现且仅出现一次。 对于每一个数独终局,我们只需把所有的一换成而或者其他的数字,就会生成一个新的数独终局,那么就有了9!种, ...
分类:
其他好文 时间:
2018-04-16 00:39:23
阅读次数:
219
首先贴一下我生成数独的性能分析图 可以看到,生成1e6组数独终局只花了接近18秒,这样的程序性能已经是非常令我满意了。 现在来看一看我的解决数独性能分析图 解决1e6个数独总共花费了300秒,可以看到,直接爆搜差不多便是这个时间了,当然有些大佬用Dancing Links X(以下简称DLX)算法加 ...
分类:
其他好文 时间:
2018-04-14 11:17:04
阅读次数:
190
下面来说一下实现数独项目的大致设计。 首先,整个项目大概包括两部分,生成数独和解数独,这两部分基本是相互独立的。所以,我将这两部分分别写一个函数,最后在main函数中分情况调用。 然后是解数独部分,解数独我分成两个函数,一个是回溯函数,一个是判断填入数字是否合法的判断函数。其中,回溯函数功能是实现数 ...
分类:
其他好文 时间:
2018-04-14 10:15:05
阅读次数:
172
最朴素的一个想法就是爆搜,但是爆搜的效率显然是很低的,我们要将问题进行转化再求解。 我们可以把数独的规则转化为4组条件: 1. 每行都要有1~9并且每一个数字只能存在一个; 2. 每列都要有1~9每一个数字只能存在一个; 3. 每个九宫格都要有1~9每一个数字只能存在一个; 4. 每个格子都要填一个 ...
分类:
其他好文 时间:
2018-04-13 11:20:39
阅读次数:
157
关键代码展示: //判断该数字在当前数独是否符合要求 int judge(int num, int ple){ int x = ple / 9; //x表示数字的纵坐标 int y = ple % 9; //y表示数字的横坐标 int qulx = x / 3; int quey = y / 3; ...
分类:
其他好文 时间:
2018-04-12 23:35:56
阅读次数:
221
在运用输入输出I/O函数中,最开始是运用的fprintf进行写入,称为程序1.0版本,在进行性能诊断的时候,我发现在生成1000000个数独终局过程竟然总共耗费了5分钟!而用VS诊断中,光fprintf函数就耗费了99.9%的时间,所以我决定加以改进。 表一 输出字符串100万次的时间(单位:us) ...
分类:
其他好文 时间:
2018-04-12 23:29:40
阅读次数:
238
对于指令的判断: 首先整个项目的指令集总共两个:sudoku.exe -c xxx Sudoku.exe -s xxx 那么判断指令是否正确也就变得简单了,首先argc一定为三,只要argc!=3那么指令一定不符合要求,其次,-c代表得到要求个数的输入终局,如果其后面的数字小于0,那么肯定是错的,而 ...
分类:
其他好文 时间:
2018-04-12 23:27:36
阅读次数:
180
初次接触到这样的任务还是很崩溃的,毕竟基础弱,在通过请教了大佬以及通过自己学习的基础上,才慢慢开始完成这项艰巨的任务。 首先,对问题进行分析:要求所给的程序能实现两个功能,一是能够根据命令生成指定数目的数独终局,二是将所给文件中的数独文件求解。 ...
分类:
其他好文 时间:
2018-04-11 21:44:37
阅读次数:
230
发现递归返回值的问题后,发现只有在每次递归生成一组sample(代表数独的第一行)后,立即根据这个sample生成完整的数独,然后直接写入就行了。 上面的代码就能根据第一行的数生成的完整的数独。 接下来是写入的问题,这个地方却是耗费我颇多功夫。毕竟刚开始接触C#。在菜鸟的C#的新手教程里,它提供的一 ...
分类:
其他好文 时间:
2018-04-09 17:21:01
阅读次数:
218