关于用舞蹈链DLX算法求解数独的解析

欢迎访问——该文出处-博客园-zhouzhendong

去博客园看该文章--传送门

 

描述

在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DLX算法的精髓——构建矩阵也就慢慢的浮现了。

 

问题

假设有一个9*9的数独,我们限制每行每列以及每个3*3的小区域有且仅有1~9这些数各一个,现在我们要把1~99个数字各9个填入这个数独里面,当然,有些数字已经被添入了,求解数独。

给张图:

 

 

 

建立模型

 

首先,数独共81个格子,每个格子都得填一个数,那么,我们要精确覆盖每一个格子,所以我们首先建立1~81列。

然后还有9行,每行1~9,每行都得精确覆盖,9行,又得建立9*9=81列;

然后还有9列,每列1~9,同理。

然后还有93*3的小格子,每个里面1~9,也同理。

那么总共要建立4*81=324列。

 

那么要建多少行呢?对于某一个位置的数字,对于已知的,只需要建立一行,表示当前行的信息;如果未知,那么我们要建立9行,第i行表示当前位置填i的情况,这个时候不怕一个位置取多个值,因为前81列的构造限制了这个。

 

对于在[i,j]i=行号-1j=列号-1,位置取值k这一行的构造,要构造什么呢?

对于第一个限制,构建第i*9+j+1

对于第二个限制,构建第81+i*9+k列

对于第三个限制,构建第162+j*9+k

对于第四个限制,构建第273+((i div 3)*3+j)*9+k

 

然后DLX跑一跑就可以了

 

思考题

16*16的数独怎么做?同理。

posted @ 2017-08-07 21:50  zzd233  阅读(1918)  评论(0编辑  收藏  举报