欢迎光临散文网 会员登陆 & 注册

第 32 讲:待定数组

2021-07-01 08:56 作者:SunnieShine  | 我要投稿

在之前,其实我们已经提到了ALS(即待定数组)的一些基本的使用方式和手段,但实际上待定数组还有很多话题要说,现在我们就来看看,ALS在链的章节里面会产生哪些有趣的内容和知识。

Part 1 强ALS

1-1 同区域异数强关系引入

如图所示,可以看到此时我们把r1c2(2)和r3c1(1)用强关系连起来,而它们是不同的数值。这是为什么呢?现在我们就来学习一下。

观察紫色的两个单元格r1c2和r3c1,可以发现此时两个单元格只含有1、2、8三种不同的数字。如果此时假设r1c2(2)为假的时候,这两个单元格里就没有2了,如果再让r3c1(1)也一并消失的话,两个单元格就都只剩下唯一的一种候选数8,使得出错。所以r1c2(2)为假时,需要r3c1(1)为真才行。

那么,可以发现r3c1(1)为真后,显然r3c4(1)是为假的,所以形成弱关系;继续推导的话,依然套用刚才的逻辑:观察到{r12c5, r3c4}三个单元格包含1、2、3、8四种数字,而此时的r3c4(1)为假,也就意味着这三个单元格里不含有1。如果此时,这三个单元格的所有2也都消失的话,这三个单元格就同时少了两种数字,便只剩下3和8,但这是三个单元格,填入两个数字是显然不够的,所以也会矛盾。所以我们就得到了r3c4(1)=r12c5(2)的结论。

于是,这条链成立了:

这个例子就分析完毕了。其中可以发现,{r1c2, r3c1}两个单元格包含三种不同的数字,因为最终填数是待定的,所以这两个单元格组成了一个待定数组结构,即一个ALS区域;同理,{r12c5, r3c4}三个单元格包含了四种不同的数字,所以填数也是不确定的,因此我们也称为一个ALS区域。

可以从例子里看到,实际上,我们利用的ALS区域的逻辑是:n个单元格里包含(n + 1)种不同的候选数,如果少掉其中的两种,就会变为(n - 1)种候选数,使得无法填满n个单元格,进而出错的结果。这便是ALS的核心。

另外,这个结构的头尾各使用了一个ALS,而中间用了弱关系连起来,是一个长度为3的链。我们把长度为3,且内部的两个强关系都产生自ALS的链称为ALS-XZ法则(或ALS-双强链法则,ALS-XZ Rule)。X和Z都表示涉及的数值,其中X是弱关系涉及的数,而Z是链头和链尾两端涉及的数。

实际上,ALS分两种,强ALS和弱ALS。为了和后续的内容作出区分,我们强制称这个结构为强ALS(Strong ALS,但一般都简称为ALS,而它一般不简称为SALS),因为在后面的内容里,ALS内存在一种与之相反的弱ALS(Weak ALS,简称WALS),这种ALS只产生弱关系。一般来说,只要我们不强调它和弱ALS的逻辑和定义不同,我们都直接简称之为ALS。

另外,你可能会有一种感觉,之前的假设推理都是“顺序确切的”,也就是推导到这里的时候,一定能确定是某个节点为真(因为是共轭对的关系,前面假后面就必须为真),而此时我们感觉这个结构里两个数之间的这种关系还差一点。比如这两个单元格里同样包含数字8。如果此时我们假设r1c2和r3c1两个8全消失的话,两个单元格也只剩下数字1可填,而且其中r1c2还没有候选数了,也照样会出错。那岂不是我还可以得到r1c2(2)={r1c2, r3c1}(8)的结论?准确的答案是,是的。强弱关系并不需要确切的顺序得到,如果像是上面这种逻辑,我们照样可以得到一样的结果,因为在强弱关系的叙述文字里,我们并未提到在推导过程里,节点之间必须是明确的顺次推导关系。比如这里,我们完全可以走候选数8的方向;当然,这个8是两个不同行列的单元格,用起来不方便而已,但客观来说,强关系确实是形成了。

那么,你真的了解ALS这个缩写吗?我相信大多数小伙伴在读到这里都是把这个词汇死记硬背记住的。ALS实际上是Almost Locked Set的缩写,而Locked Set,实际上是数组在早期的英文称呼,现在数组被广泛采用“子集”一词(Subset),所以这个说法应当为Almost Subset。而为了保持兼容性(保留原始说法以照顾以前的习惯),故这个说法继续采用了Locked Set这个古老的说法;当然,你也可以采用Almost Subset这种说法。不过,可以看到它们的缩写一个是ALS,一个则是AS,差距并不大,而表示同一个东西难免会让人觉得不好理解,所以注意区分和辨别。

1-2 ALS-XZ和伪数组

我们再来看一则示例。

如图所示,首先我们观察到,r2c169三个单元格包含3、6、8、9四种数字,现在以r2c6(3)为假作为链的起点。假设它为假后,对于r2c9(8)而言,它必须为真,否则3和8没有了之后,三个单元格里就只剩下了两种数字,填不满导致出错。所以形成了强关系;然后用弱关系连接上r1c7(8)后,因为r1c7是双值格的关系,显然r1c7(3=8)成立,所以整体的链就成立了,删数则是r2c6(3)和r1c7(3)的交集。

可以看到,这一则示例如果我们不使用链的视角,把链的线条去掉,并把8的涂色也去掉之后,{r1c7, r2c169}四个单元格将可以构成伪数组结构:四个单元格里,除了数字3以外,其余的数字都只出现在一个区域里,即它们不可能有重复的填数情况,唯独只有这里的3。而根据填数情况来分析可以发现,3必须至少有一个要出现,否则填不满四个单元格。所以删除掉数字3的交集。

所以,伪数组可以转为ALS-双强链结构,并且转换方式是,把其中单独跨区的那一个单元格分开单独作为一个ALS;而剩下的单元格就必定在同一区域了,所以它们作为一个区域,于是我们连上强弱关系就可以形成ALS-XZ结构了。

实际上,ALS最小可以只涉及一个单元格(只要这个单元格是双值格,我们就可以使用ALS,因为从定义来看,它确实也符合条件,并且可以运用强关系:如果两数同假,则“1个单元格只包含0个候选数”,这一点也都是符合刚才所说的推理过程的;而最多只能到8个单元格(因为此时最多包含了9种候选数,也就是最大情况),不过实际上,这种结构很少被使用,一般这种结构都得不到什么合适的结论。

1-3 孪生ALS-XZ

如图所示,我们来看这两则示例,这两则示例实际上是同一个题,而且结构大部分内容都是一样的。

我们先来理解第一个示例,写出它的文本表示形式。

在第一个示例里,是以r89c8(1)作为区块节点起头,假设为假的,显然,r89c8两个单元格里只有1、7、8三种候选数,而如果r89c8(1)区块节点为假,而且r8c8(7)也为假的话,则这两个单元格就只剩下8这一种数字,显然矛盾了;所以说r89c8(1)为假的时候,对于r8c8(1)来说就必须为真,所以它们形成强关系;然后,r5c8(7)和r46c9(1)的逻辑同理。

而第二个例子:

可以从例子看到,这里涉及了一个“拐弯的区块”。我们尝试把它看作和之前BUG区块类型的那种“广义的区块”一样的逻辑,把它们视为一起,那么这种结构如果为真或为假两种情况确实和普通的区块节点的逻辑是一模一样的。由于三个单元格同宫,所以视为一个节点后,它为假就只能使得其中没有任意一个单元格填入这个数;反之,如果这个节点为真,则也意味着其中只有一个单元格填入这个数,这个说法和区块节点的思维完全一样。所以我们干脆就把它也称为区块节点。

首先,r89c8(8)=r8c8(7)是显然的(这一点在上一情况已经讲到过);而对于r5c8(7)={r4c9, r5c89}(8),也是成立的:现在r5c8(7)是为假的,如果继续向下推理,如果{r4c9. r5c89}(8)这个节点也为假的话,就意味着里面没有一个单元格能放下8,此时8也没有了,而细数{r5c8, r456c9}四个单元格,里面一共是1、3、4、7、8五种数字,而此时由于两个节点同假的假设的关系,四个单元格里同时少了全部的7和8,导致只剩下了1、3、4三种数,而它必须放在这四个单元格里,这样显然是不够放下的。所以,这样便出现了矛盾。

可以看到,两个情况下,除了开头和结尾的节点不一致以外,弱关系相连的数字7是完全一样的节点,而切换到不同的头尾,就会产生不同的删数,我们称之为孪生ALS-XZ(Siamese ALS-XZ),孪生一词已经在链列(鱼)结构里出现过,正好表达的是“大部分结构相同,而不同的地方能导致不同的删数”之意。而实际上,这种结构和孪生链列一样,我们依然可以合并为一个图,如图所示。请你思考一下这个合并的示例如果整体,应该如何推理。


第 32 讲:待定数组的评论 (共 条)

分享到微博请遵守国家法律