kuangbin专题三(dance links) 题解与反思

dance links 题集题解

E、Square Destroyer

这一题比较麻烦的地方在于要删除掉特定行。本题中,由于题目会预先给你选过了部分行,所以我们要相应地删除这一部分。这十分考察我们如何理解DLX的数据结构。
那个H数组,储存的是第i行的某个节点,注意,这个节点完全是任意的。所以H数组当中的那个节点未必会一直是这一行当中的节点,有可能在删除别的节点时候顺便将这个节点删除,那么H数组当中存下来的值就完全没有意义了。
所以要删除某一行,不能够借助于H数组,而是转变思维,用dance当中的方法,就是将这一行的每一列删除。dance中的方法是,由行中的某个节点出发,断绝其他列与该列的关系。意思是,该列仍然保持与其他列的关系。并且这个节点并不断绝左右的关系,因为当删除完毕后,之后就需要还原回去,仍然有赖于这个节点。所以dance(mdlx中)每次其实是断绝一个十字与其他部分的关系。我们注意到,这个十字之后不应该再被访问直到还原,否则的话就会出现这个十字被破坏,之后就无法还原的问题。因为这个十字被删除了,所以我们可以理解为正常方法不应该访问到他。而在dance当中,由于访问总是从某个存在的列的某个节点出发,删除一个十字,而从那未被删除的节点(不是列标或者行标)出发,是不会访问到已经被删除的节点的。但是如果我们从H数组访问特定行,或者从D U数组访问特定列,那么就能访问到了,然而这是不可行,会造成问题的。
因为这一题当中,要删除的行是清楚的,然而我们并不能知道,这一行那个节点是存在的(H数组不保证存在)所以不能考虑H数组。那么就必须从列出发,依次遍历,找到这一列中属于该行的节点(有Row Col可以知道节点的行列坐标)然而我们并不知道这一行有哪些列,如果全部遍历一遍未尝不可,却太麻烦了。所以我们可以在建图的时候,先遍历一遍该列中是不是有些行已经被选中了,如果是,那么直接删除这列(用R L删除)就可以了。

F、Sudoku

这个数独问题我们完整解决了。首先注意到数独是一个精确匹配问题。当一行有了某个数,那么其他空格就不能填写这个数了。
首先我们来看一下要求,每个九宫格每行每列的1-9都不能重复,那么这里就有了三个要求。每个要求当中又有1-9九个小要求,或者具体的要求。那么我们可以将要求表述为,某个位置中某个数覆盖且仅覆盖一次。
考虑到精确覆盖问题可以表述为,从诸多选项中选出一些选项组合起来满足全部要求且仅仅满足一次。那么我们就首先看看我们可选的选项有哪些。显然,我们可以在\(9*9\)个格子当中,填入1-9,那么我们就有了\(9*9*9\)个选择项。
然后我们分析这个选择项中包含的与要求相关的属性。我们察觉到,有三重属性(九宫格编号 行标,列标)要求是,这个选择项的数字在上述三种属性所指示的空间内只出现一次。那么,我们就可以将诸多选择项分解出一些共通的属性出来,也就是,某一行、某一列、某一九宫格的1-9.此外这样的条件只能满足某一行有9个不重复数字,但是并没有说,这九个数字不能在同一个格子中。所以我们还要加上一个属性,就是其在九宫格中的位置。
另外本题可以大胆地删除某一行,还是按照dance的方法,将某一行的每一列删除,而不必担心会跨入那被删除的部分,因为本题的特性是,题目给出的数独是符合精确匹配要求的。所以,不会出现删除之前被删除的列的。

I、Divisibility

这一题是要考验我们理解DLX的算法过程的。这个题目的本质是很简单的,就是在一堆数当中选出尽可能多的数,在过程中每选择一个数,那么其倍数和因子就不能再选。所以这就是选出一个数,然后就排除若干数的过程。
我们需要找到一个算法,能够满足,选出一个数就排除一部分数。我们始终没有想到与DLX的关联,实际上这个关联是显而易见的。在DLX的执行过程中,我们是先选择一列,然后根据列选择某一行,然后将这一行覆盖的所有列删除。所以这里面完美地契合了我们的要求。就是选出一列,然后删除特定列。这里面,我们选择的一列,未必是我们要选的那个数,而是选择相应的行才是选择的数。
所以这一题是考验我们对于DLX的流程的理解,我们有一种将其作为黑箱子的倾向,这是不好的习惯,学习其他算法也有这样的倾向,我们需要仔细地思索算法过程以形成直觉。

J、A simple math problem

这一题我们误以为是一个组合数问题,实际上却是一个覆盖问题,当我们要从若干数字中选出R的幸运数字,我们一开始想的是这幸运数字已经确定了下来,只是不知道具体是多少而已,所以我们就不妨假设R个数字为1-R,然后根据这个算组合数,但是这个是错的。至于为什么错,没有搞清楚。
正确的做法是,将那R个数字的所有情况全部列出来,然后我们既然是在N个数字中选出M的数字,那么选出的那M的数字就可以覆盖掉若干R个数字的情况,这样如果我们将所有情况全部覆盖,那么就能保证中奖的。

posted @ 2020-08-31 19:22  坚持acm训练!  阅读(170)  评论(0)    收藏  举报