• 关于用舞蹈链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的数独怎么做?同理。

  • 相关阅读:
    @hdu
    @51nod
    @51nod
    @51nod
    JS-正则表达式常规运用
    CSS-复选框默认样式修改
    Vue-路由传参query与params
    Vue-阻止页面回退
    Vue-表单提交
    JS-原生的ajax
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/Dancing-Links-X-Sudoku.html
Copyright © 2020-2023  润新知