众所周知,DLX对于解决精确覆盖问题有非常出奇的效果,但我们现在考虑一种叫做重复覆盖的问题。其实这一问题是我们看到DL的论文第一部分时,对Dancing Links用法的初次想法。它就是单纯利用了链表的性质进行的模拟(请允许我这么说),但抽象而言,就是对0/1矩阵进行如下操作:选取一些行,使所有的列都有‘1’(想想与精确覆盖的不同之处)。在实现上,不需要精确覆盖的排他性操作,而在框架上的实现则是相同的。考虑一个优化,在重复覆盖问题中,对于列长是不动态计数的,能否通过初始的排序减小常数。
     以下是一般的重复覆盖问题的实现,要用到Iter-A*,使用启发函数进行加速,启发函数的设计十分简单,相信大家能看懂,此处未加过优化,如果大家有想法可以自己实现。


Dancing Links的重复覆盖问题解法#include <iostream>
Dancing Links的重复覆盖问题解法#include 
<cmath>
Dancing Links的重复覆盖问题解法
using namespace std;
Dancing Links的重复覆盖问题解法
Dancing Links的重复覆盖问题解法
const int MAXR=60;
Dancing Links的重复覆盖问题解法
const int MAXC=60;
Dancing Links的重复覆盖问题解法
const int MAXLEN=MAXR*MAXC+MAXR+MAXC;
Dancing Links的重复覆盖问题解法
int L[MAXLEN];
Dancing Links的重复覆盖问题解法
int R[MAXLEN];
Dancing Links的重复覆盖问题解法
int D[MAXLEN];
Dancing Links的重复覆盖问题解法
int U[MAXLEN];
Dancing Links的重复覆盖问题解法
int nRow[MAXLEN];
Dancing Links的重复覆盖问题解法
int nCol[MAXLEN];
Dancing Links的重复覆盖问题解法
Dancing Links的重复覆盖问题解法
int Col[MAXC]; //判定列集是否已插入
Dancing Links的重复覆盖问题解法
int Row[MAXR]; //判定行集是否已插入
Dancing Links的重复覆盖问题解法
//int RC[MAXR][MAXC]; //判定元素是否已插入
Dancing Links的重复覆盖问题解法
int RS[MAXR],CS[MAXC]; //行长与列长
Dancing Links的重复覆盖问题解法
int eid; //内存标识
Dancing Links的重复覆盖问题解法
int head;
Dancing Links的重复覆盖问题解法
int Cn;
Dancing Links的重复覆盖问题解法
int MAXSTEP;
Dancing Links的重复覆盖问题解法
//int ans[MAXC];
}

相关文章:

  • 2018-04-08
  • 2021-11-26
  • 2017-12-02
  • 2022-12-23
  • 2021-12-06
  • 2021-10-03
  • 2022-01-28
猜你喜欢
  • 2021-09-15
  • 2021-07-26
  • 2021-12-22
  • 2022-01-02
  • 2022-12-23
  • 2021-08-23
  • 2021-07-10
相关资源
相似解决方案