数独顾名思义——每个数字只能出现一次。数独是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。 这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式。
关于数独的算法有很多种,最基本的有基拙挖掘法,唯一解法,侯选数置换法.查了很多资料但都没有找到完整的算法实现.花了30块银子到当当网上买了<<编程之美>>找到其中的章节,看完之后大失所望.其中的算法实现藏头露尾,寥寥几行.让人看的云里雾里.连类定义都没有给全.
这里只好自己用基拙挖掘法实现了一个完整的算法,现共享之.其核心思想是循环在每个单元格尝试如果能找到合适的数则前进.如果找不到则进行回朔.下面是代码实现.
如有bug 请一定告之,呵呵.mail:bingbing200x@163.com
* 算法思想:
* 1.[数独的规则]是在每一行,每一列,以及每一个3*3的九宫格内都不能出现重复的数字,备选数字从1-9.
* 关于数独的具体规则请看这一篇文章:http://blog.csdn.net/kabini/archive/2008/06/30/2598524.aspx
* 2.为了数独的规则,则设置三个二维数组元素来记录行,列以及当前索引(x,y)所在的3*3九宫格内出现过的数字
* 例如:rowExistArr[0,2]==1则表示在第0行,2这个数字已经出现,所以第0行不能再出现2这个数字
* colExistArr[0,2]==1 则表示在第0列,2这个数字已经出现,所以第0列不能再出现2这个数字
* mtxExistArr[0,2]==1,则表示在索引为0的3*3九宫格内,2这个数字已经出现,3*3九宫格图解请
* 看GetMtxIndex方法上的注释.
* 3.进行数独运算前会有一些预先初始的数字, 这些数字是不能改变的, IsInitValue==true.每一个单元格对象
* SingleNumberCell ,都会有CellNumChoices对象这里记录这个当元格可供选择的数字列表。如果一个备选数字
* 违反了数独的规则,则在备选列表中选择下一个数字。如果全都违反数独规则,则把当前对象销毁掉回朔到上一个
* 单元格把上一个单元格的数字抹去重新从备选对象中选择下一个数字。IsProcessed==true的cell对象都是回退时
* 经过的对象。