美文网首页程序员
编程之美之构造数独

编程之美之构造数独

作者: 娟子 | 来源:发表于2014-04-08 15:40 被阅读0次

    数独(すうどく,Sūdoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。

    问题:

    构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。

    解法一

    首先用二维数组的结构来存储数独游戏sudoku[][9],通过经典的深度优先搜索来生成一个可行解。

    深度优化搜索算法

    从[0][0]开始对于没有处理过的格子获得一个可取的值,在搜索过程中如果没有发现可行的值则回溯,修改前一个格子的取值。直到所有的格子都取到可行的值为止,这时候我们就找到了一个可行的解。

    算法流程图:

    算法复杂度:O(n^2)

    解法二

    置换法,就是用矩阵行交换和列交换,这个方法的优点就是速度很快,缺点就是只能构造9!种,离所有合法数独总数差的很远。

    算法实现过程:

    1.假设已经有一个3 *3的矩阵是排列好的,具体的数字暂时用字母代替,如下图所示:

    2.把整个数独矩阵的各个小矩阵(也就是宫)分别命名为B1,B2,...,B9:

    3.将已有的3*3矩阵放在B5的位置,得到如下图所示矩阵:

    4.通过置换行的方法,把B4和B6矩阵填好。

    5.对中央小矩阵的每一列做同样的变换,得到B2和B8.

    相关文章

      网友评论

        本文标题:编程之美之构造数独

        本文链接:https://www.haomeiwen.com/subject/qjlltttx.html