编程之美之构造数独



数独(すうどく,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.



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容