当前位置: 代码迷 >> 综合 >> Dancing Links 精确覆盖问题的快速dfs
  详细解决方案

Dancing Links 精确覆盖问题的快速dfs

热度:15   发布时间:2023-12-21 00:04:26.0

引.精确覆盖问题:

给定一个矩阵0-1矩阵,如:

1 0 1
0 0 1
0 1 0

判断或输出一些行,这些行的在同一列上有且仅有一个1,如上面的第1和第3行就符合条件。


这个问题是NPC问题,必须用搜索。但是解决这么一个问题有什么用呢?


一。实际问题转化为精确覆盖问题解决

   这里以数独为例。数独的游戏规则是:

  

在一个9*9格图中填入1-9这九个数字各9次,使得格图中每行/每列,以及3*3小方块中都不包含两个同样的数字,如下图:


     那么这个问题怎么转化为精确覆盖问题呢?

     回到精确覆盖的定义,我们要寻找的是那些同一列上含且仅含一个1的行。那么,把同一列上的1看成全局必须满足的条件,而且这种条件必须只满足一次。

     分析数独问题的全局条件:


     
     1.首先,一个格子上的数字必须有且仅有一个数字2.每一行上必须包含且仅包含一个1/2/3.。。3,每一列上必须。。。4.每个小方各上。。。


     这样子问题就清晰了,我们要找的各个行最后可以拼凑一个完整的全1行,满足这个性质的那些行就代表了数独已经完成填写。

     有了上面的分析,我们可以定义:

    

     1.81个列 代表某格子上有数字
     2.81个列 代表某行上已经有某数字
     3.81个列 代表某列上已经有某数字
     4.81个列 代表某小方格上已经有某数字

        这样就需要81*4个列,另外,一个小方格上可能填9个数字,故需要81*9行(方格上数字确定了,后面81*3列上是否是1也就确定了,故状态其实没有那么多。

  

       至此,数独问题也就转化成精确覆盖问题了。