POJ3074 Sudoku 舞蹈链 DLX】的更多相关文章

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建  (两个传送门) 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; ,M=,S=N*+M; struct D…
题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出现一次3.每个位置的数字在一列只能出现一次4.每个位置的数字在一个宫格内只能出现一次然后针对每个位置可以建立舞蹈链了前81列,为1条件的约束82-162列,为2条件的约束163-243列,为3条件的约束244-324列,为4条件的约束则舞蹈链行数为确定的点数+未确定的点数*9,列数为324.如果i行…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的16*16数独,求解. 题解 DLX + 矩阵构建  (两个传送门) 学完这个之后,再思考这一题.同样,每个位置每种取值4个信息. 数独共256个格子,每个格子都得填一个数,那么,我们要精确覆盖每一个格子,所以我们首先建立1~256列. 然后还有16行,每行1~16,每行都得精确覆盖,16行,又得建立16*16=256列: 然后还有16列,每列1~16,同理. 然后还有16个4*4的…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建  (两个传送门) 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; ,M=,S=N*+M; struc…
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集合中,每列有且仅有1个1. 例子 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 那么答案就是 重复覆盖问题:精确覆盖问题的变形,允…
"在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\(S*\)中恰好出现一次.在计算机科学中,精确覆盖问题指找出这样的一种覆盖,或证明其不存在." \(0x01\) 精准覆盖问题 --其实是一种决策问题,给定\(n\)行长度为\(m\)的\(0,1\)序列,要求选出一些行,使得每一列有且仅有一个\(1\),这就是精准覆盖问题. 诚然,我搜索贼菜,所以暂…
LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂. 于是直接看代码了 应该算是把代码给理解了 于是就懂了链表是怎么操作的. 首先 对于列先建立一个循环链表 r[0]==0时 说明所有的列被填完. 没必要建立0的点 因为没有什么用 只需要知道1在哪即可. 对于1的结点新建结点 然后这些结点组成一个双向十字链表 注意和上面那个循环链表不连在一起. 这…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值乘上该位置的权值,每一个位置的权值如下: 题解 DLX + 矩阵构建  (两个传送门) 然后,对于本题,只需要把所有的情况搜光即可. 代码 #include <cstring> #include <cstdio> #include <algorithm> #include…
正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 \(n*m\)的矩形有\(0/1\),要求选出若干行使得每一列有且仅有一个\(1\). 解题思路 精确覆盖问题指的是一个集合\(S\)和它的若干个子集集合\(T\),要求选出\(T\)的一个子集使得里面的集合元素刚好覆盖集合\(S\). \(DLX\)全称是\(dancing\ link\ X\),其中\(dancing\ link\)是指交叉十字循环双向链,\(X\)是指暴搜. 知道了这些,…
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 描述 在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DLX算法的精髓——构建矩阵也就慢慢的浮现了. 问题 假设有一个9*9的数独,我们限制每行每列以及每个3*3的小区域有且仅有1~9这些数各一个,现在我们要把1~9共9个数字各9个填入这个数独里面,当然,有些数字已经被添入了,求解数独. 给张图: 建立模型 首先,数独共81个格子,每个格子都得填一个数,那…