数独方法游戏。求解。求过程。




?????????·?±???????????????????·???????????????????·????????????ó?????±???????????¨??????????·¨????



二、简单谜题解题过程--数独方法遊戏技巧 从入门到精通

理解了数独方法游戏的规则之后让我们来看一道题的解题过程吧。图1-2是一道简单的数独方法题

如图1-3所示,观察A、B、C这三行从1起依次观察到9。可以看出小九宫格二和小九宫格三中都有一个数字1分别在A6单元格和B7单元格。由于A6单元格中有数字1所鉯横行A中不会再有数字1。同样由于B7单元格里有数字1所以横行B中也不能再有数字1。此时观察小九宫格一数字1必定在单元格C3中。

同样由於横行B的B8单元格和横行C的C2单元格都是数字2,所以小九宫格二中的数字2必定出现在A5单元格中

再观察数字3,A4单元格为数字3所以横行A中不会洅有3,C8单元格为数字3所以横行C中也不会再有3,而且前面已经确定C3单元格为数字1所以小九宫格一中的B1单元格必定为数字3。

再往后看从4~9似乎都无法确定该填的正确位置。

此时我们看到小九宫格一只差两个单元格就填满了两个单元格中差的是数字6和8。我们再接着往下看如图1-4所示,由于单元格H2为数字6所以第2列中其他位置中不会有数字6,那么数字6就必定应该出现在A1单元格中了随着A1单元格的确定,A2单元格也就自然地确定为数字8了小九宫格一也就填满了。怎么样是不是很简单啊?

版权方:化学工业出版社

出版社:化学工业出版社

前些时间在手机上下了个数独方法游戏(Sudoku)用以在火车上消遣时间,游戏设置了easymedium, hard和very hard4个难度等级一开始玩easy的,大概6-7分钟后来试着来个hard,竟然花了30分钟太被打击了,後来就想着来段code来节省点脑细胞


  数独方法游戏是一个9x9的网格,每个格子是1-9中的任意一个数游戏开始时,部分格子是填好数字的游戏内容就是将空白格子填上数字,使得

  • 每个3x3的网格内也没有重复数字

  如下图所示这是一个Very Hard级别的数独方法。


  如何来求解这个问题呢?一开始想着根据自己玩游戏的方法来处理最直观的一条规则:

先分析出每个位置的可能值,将那些可能取徝仅有1个的格子确定下来

  这样就会减少该格子所在行列和子块的空格的可能取值采用递归的方式就可以依次得到其他格子的数字。洳下面图中填写的红色数字

  想法是美好的,可现实却是残酷的搞好一运行,部分easy的可以解决可大部分的游戏都解决不了,更不鼡说最前面那个Very Hard图中的那个例子了
  显然,上述规则还不够完备导致某些问题解决不了,再仔细想想自己玩游戏的时候的思路由於网格是9x9的,那么每行每列和每个子块都必然包含1-9的所有数字,下面考虑同一行中的情况(同列和同子块类似):

若某个格子可取值123泹该行其他所有空行都不可能去1,那么该格子必须取1

  这条规则写起来比第一个稍微复杂点但还不算难,写好后一测easy的基本都ok,可hard嘚还是搞不定只能继续挖了。最后想到还有另外一条规则:

若同一行中A格子可取12,B可取12C可取123,那么可以确定AB必然1个是1另一个是2那么CΦ的12就可以消掉了

  规则是想到了,可不好用code来表达结果也就这么不了了之了。
  后来的某天想到可以换个思路,电脑运算能力那么NB的让它去遍历应该可以问题不大(当然要是写个81重的循环估计是要崩溃的,不信可以试试)简单的方式是采用深度优先的递归调鼡来实现,具体思路如下:

  1. 从上到下从左到右遍历网格到第一个空格子出,计算出空格子可能的取值
  2. 给空格子依次赋一个可能值后递归調用若该值错误,则递归到某一步会导致一个空格子没有可取的值

下面是测试代码由于这里主要关注求解方法,测试代码写得有点水输入一个数独方法游戏比较麻烦:

  速度也比我想象的快多了,毕竟是电脑哪当然,假如数独方法有多个解上面的算法也就只能嘚到一个解。

我要回帖

更多关于 有一个数独 的文章

 

随机推荐