關於DLX可以看看
這篇論文
還可以看看
這篇題解,寫的都很不錯的
其實要不是數據量這麼大,我就用DFS解決掉算了,DLX真的好難寫啊,到處都容易錯思維難度又大(不過效率好高),一定要思路非常清晰才能敲代碼。調試了好長時間才AC。
Copy CCY大大的一段(建立模型):
01列是条件。整个数独问题解决后,棋盘上要满足那些条件呢?
1、每个格子都填入了数字;
2、每一行都要有1~9这9个数字填入;
3、每一列都要有1~9这9个数字填入;
4、每一块都要有1~9这9个数字填入。
所以,01模型中列的定义就出来了。
(i,j,k表示在棋盘上i行j列填入数字k。)
1到81,表示棋盘中9*9=81个格子是否填入了数字。如果是,则选取的01行在该01列上有1。
对应的01列编号为:(i-1)*9+j。
81+1到81*2,表示棋盘中9行,每行的9个不同的数字是否填入。棋盘上某行已经填入了某个数字,则在选取的01行上,对应的01列有1。
对应的01列编号为:81+(i-1)*9+k。
81*2+1到81*3,表示棋盘中9列,每列的9个不同的数字是否填入。
对应的01列编号为:81*2+(j-1)*9+k。
81*3+1到81*4,表示棋盘中9块,每块的9个不同的数字是否填入。
01行是状态。数独做完后的状态是什么,就是棋盘上每个格子填入的究竟是什么数字。
所以,01行表示的是,棋盘上某个格子填入的是什么数字。
那01行的行数就是9*9*9。
每01行,既在棋盘中某个格子填入一个数字,会影响01矩阵的那些01列呢。
(i,j,k表示在棋盘上i行j列填入数字k。)
这01行的状态要影响棋盘上对应的格子是否填入数字的01列:(i-1)*9+j。
这01行的状态要影响棋盘上对应行填入数字k的01列:(i-1)*9+k。
这01行的状态要影响棋盘上对应列填入数字k的01列:(j-1)*9+k。
这01行的状态要影响棋盘上对应块填入数字k的01列:(u-1)*9+k。(u是由i,j对应到的块的标号。)
这样,数独就转换成了01矩阵的精确覆盖问题,选定一些01行,既在选定在棋盘中某些格子上填入某个数字,使得他们满足01列每列上有唯一的1,既满足数独的所有条件,且保证每行每列每块只有一个数字k(1<=k<=9)。
我的代碼(AC,952K,63MS,Pascal):
排版彻底混乱了,唉,用附件发送吧。
有不懂的地方可以問哦,或者把代码发给我也行的