关于用舞蹈链DLX算法求解数独的解析
欢迎访问——该文出处-博客园-zhouzhendong
去博客园看该文章--传送门
描述
在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DLX算法的精髓——构建矩阵也就慢慢的浮现了。
问题
假设有一个9*9的数独,我们限制每行每列以及每个3*3的小区域有且仅有1~9这些数各一个,现在我们要把1~9共9个数字各9个填入这个数独里面,当然,有些数字已经被添入了,求解数独。
给张图:
建立模型
首先,数独共81个格子,每个格子都得填一个数,那么,我们要精确覆盖每一个格子,所以我们首先建立1~81列。
然后还有9行,每行1~9,每行都得精确覆盖,9行,又得建立9*9=81列;
然后还有9列,每列1~9,同理。
然后还有9个3*3的小格子,每个里面1~9,也同理。
那么总共要建立4*81=324列。
那么要建多少行呢?对于某一个位置的数字,对于已知的,只需要建立一行,表示当前行的信息;如果未知,那么我们要建立9行,第i行表示当前位置填i的情况,这个时候不怕一个位置取多个值,因为前81列的构造限制了这个。
对于在[i,j]i=行号-1,j=列号-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的数独怎么做?同理。