找回密码
 欢迎注册
查看: 44706|回复: 50

[擂台] 数独终局计数问题

[复制链接]
发表于 2007-12-27 13:10:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我来个计数问题,这个问题我部分解决过,
在我的CSDN博客上有源代码,不过今天CSDN博客在更新不能访问,我也不知道链接是什么。
关于数独,可以查看:
http://mathworld.wolfram.com/Sudoku.html
简单来说,就是一个9*9的正方形,里面可以分成9个3*3的小正方形,我们通常称为9个宫格
其终局就是在81个格子分别里面填上1-9各9个,使得,每行,每列,和每个宫格里面都没有重复的数字。
问题是数独终局总共有多少个,上面的wolfram链接里面我们可以找到这个答案是:
6670903752021072936960
这个结果我的程序计算过,在我的双CPU(P4 3.6G)的Linux机器上需要运行2个多小时。
看看大家能否设计出更加快的代码。
另外一个问题是对于每个数独终局,我们通过置换1-9这9个数字(比如1改成2,2改成1),可以得到另外一个数独终局,所以这两个数独终局本质是相同的,同样的,如果我们将任意数独终局旋转90度,或者翻转,或者交换前面3行中任意两行等等超作,都可以得到另外一个数独终局,所以这些局面也是本质相同的。
现在问,本质不同的(也就是无法通过置换数字和简单的旋转,翻转,行列交换操作相互转化的)数独终局有多少个。
上面wolfram链接里面可以找到答案是5472730538
看看大家能否设计一个较好的程序予以计算。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2007-12-28 08:20:17 | 显示全部楼层
csdn blog又可以访问了,
我那个计算终局数目的代码在:
http://blog.csdn.net/mathe/archive/2006/11/27/1416891.aspx
分成两个可执行程序
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-1-13 14:57:46 | 显示全部楼层
mathe兄真高手也,佩服之至.
以后不免有大量问题请教,还得辛苦mathe兄.
对于给定的数独题目,什么方法解决最合理? 递归?还是动态规划?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-1-13 20:15:47 | 显示全部楼层
解数独题,我不知道有什么动态规划的方法,但是只使用递归方法可能速度上有问题,通常会将递归同一些简单的策略相结合(比如发现某行只留下某个格子没有填充了,某个格子对应的行列宫格已经使用了8个数字等),通过这种方法计算机已经可以非常迅速的求解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-29 16:21:42 | 显示全部楼层
今天在电脑里面找到一个比较早的版本的我的数独的源代码(最新代码已经丢失了)。
由于我已经对于它失去了继续开发的兴趣,现特意发布到这里,有兴趣的朋友可以参考一下。

sudoku.tar.gz

53.74 KB, 阅读权限: 20, 下载次数: 44, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

售价: 1 枚金币  [记录]

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-1-29 16:44:43 | 显示全部楼层
根据资源文件,这个版本应该对应1.13版本,对应功能可以参考csdn中连接:
http://mathe.download.csdn.net/user/mathe/all/6
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-1-29 17:11:57 | 显示全部楼层


光数独游戏你就赚了多少资源分啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-1 20:00:49 | 显示全部楼层
mathe兄的这个程序是我见过的最棒的数独程序
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-2 08:00:53 | 显示全部楼层
多谢夸奖。不过程序可改善的地方还有很多。
大家如果有兴趣可以继续改良一下。上面附件提供的版本有点老(新版本丢失了),但是基本功能提供了(当然界面方面的功能比较落后)。此外还有里面的forcing chain的方法还没有实现,而这个算法的实现需要使用图的数据结构。
此外程序里面基本数据结构采用了位运算,但是这种方法不见得最好(我只是试验一下采用这个数据结构,后来发现效率还可以就没有改良了)。我挺想知道如果采用其它数据结构效率会如何。
另外程序里面产生数独局面的代码效率不是很高,最好有人能够继续优化一下(而且这部分使用不同的数据结构应该效率会更好)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-4 18:51:03 | 显示全部楼层
我觉得这个问题的计数还需要用到群论,不是那么简单的问题!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-11 05:08 , Processed in 0.051925 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表