楼主: newkid

用PLSQL解数独(SUDOKU)

[复制链接]
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
31#
发表于 2008-11-8 16:51 | 只看该作者
第一次听说这个游戏,支持。。。

使用道具 举报

回复
论坛徽章:
9
六级虎吧徽章
日期:2009-01-03 20:00:34
32#
发表于 2008-11-8 18:31 | 只看该作者
newid的大哥真的太强了,学习!

使用道具 举报

回复
论坛徽章:
0
33#
发表于 2008-11-8 23:12 | 只看该作者
thanks

使用道具 举报

回复
论坛徽章:
5
奥运会纪念徽章:柔道
日期:2008-08-15 10:28:18生肖徽章2007版:马
日期:2008-09-30 11:09:10奥运会纪念徽章:足球
日期:2008-10-24 13:28:14生肖徽章2007版:龙
日期:2009-03-10 21:27:46ITPUB社区OCM联盟徽章
日期:2013-08-21 15:43:50
34#
发表于 2008-11-9 00:30 | 只看该作者
留名,想研究算法

使用道具 举报

回复
论坛徽章:
3
CTO参与奖
日期:2009-01-15 11:42:462010新春纪念徽章
日期:2010-01-04 08:33:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
35#
发表于 2008-11-9 02:07 | 只看该作者

不好意思,30楼帖子有误。“五毒俱全”解出,结果如下:

five sudoku : 1
5 8 2   4 6 9   7 1 3
9 6 4   1 3 7   2 8 5
7 3 1   8 5 2   4 6 9

1 7 3   5 2 8   6 9 4
4 9 6   3 7 1   8 5 2
2 5 8   6 9 4   1 3 7

8 2 5   9 4 6   3 7 1
6 4 9   7 1 3   5 2 8
3 1 7   2 8 5   9 4 6
------------------
2 5 4   6 1 9   7 8 3
6 7 9   5 8 3   4 1 2
3 1 8   4 2 7   5 6 9

4 2 5   1 9 6   3 7 8
7 9 6   3 4 8   1 2 5
8 3 1   7 5 2   9 4 6

5 4 2   9 6 1   8 3 7
9 6 7   8 3 4   2 5 1
1 8 3   2 7 5   6 9 4
------------------
3 7 1   6 9 8   5 4 2
5 2 8   3 4 1   9 6 7
9 4 6   7 2 5   1 8 3

8 3 7   5 1 9   6 2 4
1 5 2   4 3 6   7 9 8
6 9 4   8 7 2   3 1 5

2 6 3   9 5 4   8 7 1
4 8 5   1 6 7   2 3 9
7 1 9   2 8 3   4 5 6
------------------
7 5 9   1 8 4   2 6 3
1 2 3   7 6 9   4 8 5
6 8 4   5 2 3   7 1 9

9 7 5   4 3 8   1 2 6
4 1 2   9 7 6   5 3 8
3 6 8   2 1 5   9 4 7

5 9 6   3 4 1   8 7 2
8 4 7   6 9 2   3 5 1
2 3 1   8 5 7   6 9 4
------------------
8 7 1   3 6 9   5 2 4
2 3 9   5 4 7   6 1 8
4 5 6   2 8 1   7 9 3

7 4 2   8 1 5   9 3 6
5 6 3   9 2 4   1 8 7
9 1 8   7 3 6   2 4 5

3 8 7   6 9 2   4 5 1
1 2 5   4 7 8   3 6 9
6 9 4   1 5 3   8 7 2
------------------
0.172000 seconds

用回溯法,先得出左上、右上、左下、右下四个大九宫,再将结果与中间大九宫合并,最后解出“五毒俱全”。
程序源码: sudoku_five.zip (33.6 KB, 下载次数: 37)

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
36#
 楼主| 发表于 2008-11-9 12:23 | 只看该作者
addm真棒!我也刚刚完成,代码下周一再整理贴出。先下载你的版本学习!

582469713***254619783
964137285***679583412
731852469***318427569
173528694***425196378
496371852***796348125
258694137***831752946
825946371698542961837
649713528341967834251
317285946725183275694
******837519624******
******152436798******
******694872315******
759184263954871369524
123769485167239547618
684523719283456281793
975438126***742815936
412976538***563924187
368215947***918736245
596341872***387692451
847692351***125478369
231857694***694153872

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
37#
 楼主| 发表于 2008-11-11 02:45 | 只看该作者
我的PL/SQL代码已经更新到一楼主贴附件中。

addm的C++解法我看了,这个解法思路很简单, 因此代码比较好读。他对每个空位循环用1-9测试;测试的办法是和本行、列、区的所有非空值作比较。
我的方法则对此作了些预处理优化:我为每个空位建立了候选值清单,因为已知值是可以从里面划掉的,这样就不必1-9都测试;当检验一个值是否可用,我没有遍历和本行、列、区的所有位置,而是用了如下两种方法:
1.为每个行,列,区各设置9个标志位,某值被用过则置1, 回溯时重设为0. 这样有些额外动作,但只要三个判断就可决定某值是否可用,总体来说是合算的。
2.在我的版本3中放弃了标志位,采用维护候选值清单的办法。对每个空格设置一组指针,指向其后续的其它空格,当本空格取某值时,将它从后续空格的候选清单中删除。回溯时则补回去。用这个办法根本不用测试了,有值就是可用的;虽然它也多了维护清单的开销,额外的好处是在删除时如果发现已经是最后一个了,则可以快速放弃,相当于提早回溯。经过1000个题目测试,这方法比方法1更好。

addm对所有空格按照行,列的顺序处理,我事先排了一下序,当然这个排序没有理论支持,但实际效果不错。
addm先解好上下左右四个方位的所有解,最后穷尽所有解的排列来解中部的标准数独。我的方法则只有一条线,由于各空格的链接事先处理好,在对重叠部分求解的时候相当于一下子就解了两个题。

说了这么多,到底实际效果孰优孰劣?C++的用时0.07秒,PL/SQL用时0.35秒。毕竟PL/SQL是种解释型语言,和C++没得比。
如果addm老兄有空,把自己的C++代码移植到PL/SQL, 我很有兴趣再来PK一下!

使用道具 举报

回复
论坛徽章:
2
八级虎吧徽章
日期:2008-12-24 12:00:59CTO参与奖
日期:2009-01-15 11:42:46
38#
发表于 2009-1-12 13:57 | 只看该作者
mark it for study

使用道具 举报

回复
论坛徽章:
3
奥运会纪念徽章:拳击
日期:2008-06-29 16:06:00CTO参与奖
日期:2009-02-03 14:04:30生肖徽章2007版:虎
日期:2009-11-19 16:42:12
39#
发表于 2009-1-21 16:52 | 只看该作者
潜水N年,不得不上来顶一下。佩服!

使用道具 举报

回复
论坛徽章:
0
40#
发表于 2009-4-30 11:33 | 只看该作者
.......太弓虽了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表