【数据结构】用Dancing Links解决精确覆盖问题
插入一个节点依赖于表头。H[]记录的是每一行第一个元素的位置。
删除操作删除的是这一列和这一列中有1的行。
恢复操作和删除操作相反。
搜索过程按照上面的思路即可,判断表中是否为空只要看0号表头左右是否有列。
精确覆盖问题本身比较抽象,一般不会出现裸的情况。但精确覆盖问题有实际的意义,行是提供的选择的所有的可能性,列是限制与约束条件,只要能将其它问题转换为这种形式,就可以套用DLX解决精确覆盖问题的模式了。
例:POJ3740 Easy Finding
裸的精确覆盖
代码:http://blog.csdn.net/cyberzhg/article/details/7750412
数独可以说是转化为精确覆盖问题的最经典的例子了。行作为选择的可能性,9×9数独一共81个方格,每个方格有9中填法,所以矩阵一共729行。每一行、每一列、每一个3×3方格数字不能重复,每一个方格必须填一个数字,所以矩阵一共(9+9+9)×9+81列。为了构造矩阵,如果当前位置的数字已经给出,则把对应行的相应位置置1即可,如果数字没给出,就把1~9所有数字加入。
例:
9×9的数独:
POJ2676 Sudoku
代码:http://blog.csdn.net/cyberzhg/article/details/7750426
POJ3074 Sudoku
代码:http://blog.csdn.net/cyberzhg/article/details/7750432
16×16的数独:
POJ3076 Sudoku
代码:http://blog.csdn.net/cyberzhg/article/details/7750434