免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24735 | 回复: 2
打印 上一主题 下一主题

数独的算法这么简单? [复制链接]

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-01 16:03 |只看该作者 |倒序浏览
算法的基本思想:

  步骤1、将所有未确定的格子的可能性定义为0xFFFF(即所有数字都可能),可能数目为9。

  步骤2、寻找所有确定的格子A(可能数目为0),在所有与A同行、同列和同区域的未确定的格子的可能性中减去与A相同的可能性。例如:A确定为9,则与A同行、同列和同区域(区域标志相同)的未确定的格子的可能性与0xFEFF按位与(除去可能性9),并将其可能性数目减少。

  在除去可能性的过程中如果发现某个格子B的可能性数目由1减小为0,说明B和A只能取相同的数字,这可能是题目本身无解引起,也肯能是由于步骤3中搜索方向不对引起的,可认为此方向的搜索无解,退出这一方向的搜索。定义这个检查为唯一性检查。

  步骤3、寻找所有未确定格子中可能性数目最少的格子M,如果M的可能性数目为1,则确定M:将M的可能性数目定义为0,并把确定数量加1,如果此时确定数量达到81,则报告找到解,否则,在所有与M同行、同列和同区域的未确定的格子的可能性中减去与M相同的可能性,并进行唯一性检查。然后重复步骤3。

  如果M的可能性大于1,则把M假设为所有M的可能性,分多个方向进行搜索,在每一个搜索方向重复步骤3(这个可以用递归来实现)。

作者还给出了C代码。
http://simplesource.blog.163.com ... 140620077104021963/
---------------
直接玩,可是想破了脑袋呀。

论坛徽章:
0
2 [报告]
发表于 2012-06-01 16:43 |只看该作者
本帖最后由 aychxm 于 2012-06-01 16:44 编辑

解数独的算法,无非两个方法重复多次地解决每一个空格子:排除,否则就假设


对一个格子,横的、竖的、还有3x3的,用1~9去查,看哪些数可以填,如果确定了,就填进去,
再看哪些数不能填,如果1、2、3、5、6、7、8、9都不能填,那就只能填4了。
如果不能确定,就在可能的数中做假设,再往后推,最后冲突了,再假设另一个。


生成数独的算法才有商业价值。

论坛徽章:
0
3 [报告]
发表于 2012-06-01 18:28 |只看该作者
回复 1# mirnshi


    如果是想解数独的算法的话,建议可以尝试一个dancing links。非常优美并且速度非常快的一个算法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP