http://www.meichua.com (收藏,设为首页)
以前打牌的时候出牌太慢,其他人就叫着出啊,出啊,所以就变成了chua...... (手机请访问 http://3g.dlog.cn/meichua)
上一篇:中国足球之死 下一篇:河 游泳

一个sudoku的solver

2008年7月31日(Thursday) 11点23分 作者: chua 天气: 心情: 一般

  前段时间看到了sudoku的游戏,被这个游戏所吸引,在www.websudoku.com 上玩了好久.随之也对之产生了兴趣,特写了一个sudoku的solver.

  先来介绍一下sudoku,典型的9*9格也称之为9宫格,近年来风靡世界,一个从满智慧的游戏.如下面一个sudoku puzzle

 

y

^

|

|

|

0 ----------------------------------------------------------------->x

游戏规则:

1:填入1~9的数字(当然这只是9宫格,如果是16*16的,那就是填入1~16的数字)

2:每行不能有重复的数字

3:每列不能有重复的数据

4:每3*3的小方块内不能有重复的数字

这是一个简单的puzzle,预先已填的数字很多,当然玩这个游戏也有技巧,应当先选取已填入数字多的行或列或3*3格开始游戏,当有小格有几个数字都可以填入时,那就要试了.

如上题可以选取x=1 或 x=9 的列开始,解为:

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

 

接下来介绍一下我的java解题方案

1:先loading一个sudoku

2:计算每个空格的优先权,可填入的数字.将sudoku放入stack中

3:从stack中取出一个sudoku,根据优先权和可填入的数字,将一个sudoku分成一个或多个,判断每一个是否已经完成,检查正确性,如还未完成,则检查是否丢弃此sudoku,如果没有完成且还要继续填充,则放入stack

4:接着做3直到完成

基本方案就是这样

网上比较成熟的方案如使用dancing link algorithem,我没有仔细看,大致也就是这样,遍历算法.

csdn上有人用c写的dancing link解决方法,世界上最难的puzzle上,我这个xp2500+的cpu下,需要3.5秒左右

我没有用dancing link算法的java实现来做,所以也就没法对比.

 

源代码见:

 http://meichua.googlecode.com/files/sudoku.rar

 

标签: sudoku java solver 
评论者: chua 2008-10-26 16:58 (Sunday)

后来拿dancing link algorithem得java代码测试,速度非常快,给我的快几个等级,好算烦,只是没有中文介绍,纯粹看代码太累,有空还是要研究一下这个算法

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验