Dancing-Link+数独版

最basic的Dancing—Link

这一篇由于时间关系,我就不写这么详细了。
参考的博客多了去了。
Dancing-Link的思想:
先来看一个问题。有n件两两互不相同的物品。有m种选择方案,问选择m种选择方案中的哪些,能够顺利地将n件物品正好选择一次。
这个问题可以转化到一个01矩阵。
(i,j)=1,表示第i种选择方案选择了物品j。(i,j)=0反之。
普通的暴力就直接dfs搞一波得了,但是会很慢。
那怎么改进?
有个人特别地厉害,他发现了一个关键点。
原来的01矩阵,通过选择了一个行x,将某一些行和列给删了,剩下一个更小的矩阵。首先可以确定的是,被删掉的列就是行x中包含的物品的集合。
那么被删除的行z呢?z和x是“有交”的,准确地说,就是存在一列w,(z,w)=(x,w)=1.
那个人使用双向链表存储状态。
第一步,选择一个未被选的列c。
第二步,选择一个(x,c)=1的行x。
第三步,删掉列y,(x,y)=1,还有行z(与行x“有交”)
第四步,递归下一步,进入子问题。
①如果整个矩阵全0,那么这个解是错的。
②如果矩阵没了,说明找到了一组解。
链表中的元素是很好删的,但是怎么在回溯的过程中回步呢?
只要将被删除的元素的序列反过来重新连边即可,因为被删除的元素的上下左右指针还是存在的。
最后总算是改进了一大步。

普通的Dancing-Link就能完暴全场?

答案显然是错的。
因为实践是检验真理的唯一标准。
通过实验,我们发现,普通的Dancing-Link被虐爆了。
所以要加优化。
第一个优化:Dancing-Link中记count[x]为 Σ i = 1 n   [ ( i

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值