EH的数独杂谈#8-1 标准鱼/链列
--------
目录
一、一个二链列(X-Wing)的实例
二、标准鱼的概念及一般使用方法
三、三链列(Swordfish),鱼的残缺
四、鱼的互补
--------
这是本系列的第8章,也是这个时隔一年的系列的新篇章。过去的章节主要集中在链的讲解上,而且大多涉及不同种类的候选数。而在本章,我们将会讨论一种基于同种候选数的排列组合而产生删数的系列技巧——鱼(Fish,也被称作链列)。
一、一个二链列(X-Wing)的实例
在正式讲解鱼的概念前,先用一个二链列(X-Wing,也称为四角对角线法则)的例子带大家体验一下鱼是怎么使用的:
请观察r3和r4这两行的候选数2,它们都只能出现在c3和c6这两列上。显然根据数独规则,这两行2的填法有且仅有两种:
·r3c3=r4c6=2(左上和右下);
·r3c6=r4c3=2(右上和左下)。
确定了两种填法之后,我们把视角转移到列上。比如对于第3列,无论取那两种填法的哪一种,都可以保证该列的2必然出现在r3c3或者r4c3。这样,第3列的绿色格都不可能是2了,即得到删数:
r2c3<>2
对于第6列也是同理,第6列的绿色格也都不可能是2。
或许大家已经注意到,虽然二链列在形式上是矩形,但其原理和使用方法和UR存在本质的区别。基于上面的例子,来介绍一些和鱼技巧有关的基本概念。
二、标准鱼的概念及一般使用方法
让我们回顾一下刚才的推理步骤:
(1)我们选取了两行(r3,r4)和一种候选数2;
(2)我们发现了这两行的候选数2只能出现在两列上(c3,c6);
(3)因此我们得到“两列上其他位置不可能是2”的结论。
这种标准鱼的结构定义在r3和r4两行,并在c3和c6两列产生删数,由此引出定义域,鱼身和删数域的概念:
(1)定义域:一个n行(列)的区域,涵盖某种候选数,并保证这些候选数只分布在n列(行)上。行数与列数需要相等。例如刚才的例子中,r3和r4两行就是定义域,因为它既包含了这两行的所有候选数2,也保证这些2只分布在两列上。
(2)鱼身:这些候选数本身所在的单元格。例如刚才例子的r34c36四格。
(3)删数域:垂直于定义域,且贯穿(但不包含)鱼身的区域。例如刚才例子的c36两列的绿色格子,都可以删除候选数2。
基于上述定义,总结标准鱼的一般食用(划掉)使用方法:
(1)确定要使用技巧的某一种候选数,找出合法的定义域。
(2)在删数域上删去这种候选数。
经过对刚才方法的总结,我们现在可以去看更大的标准鱼结构了。
三、三链列(Swordfish),鱼的残缺
*是的,你没有看错,三链列确实又称为剑鱼(Swordfish)。*
二链列为什么被称作二链列?因为它涉及两行两列。以此类推,三链列就是一个涉及三行三列的鱼结构,比如下面的例子:
啊嘞?既然二链列是2x2的结构,那三链列不该是3x3的吗?现在缺了一角,这东西还能够使用吗?
实际上,这并不违反我们刚才的定义:我们选择了r346作为候选数6的定义域;即使缺了一角,这三行的候选数6还是只能分布在c159三列上,只不过填数的情况更少了而已。这样,c159除鱼身外的部分可以成为删数域,删去r2c5的6。
这种“缺了一角”的情况,我们称之为残缺。请注意,残缺并不意味着鱼本身不成立。实际上对于三链列来说,缺三个角是它残缺的极致,读者可以尝试自行理解图8-3的删数。
四、鱼的互补
其实鱼是具有互补性的。在一处比较“明显”的鱼背后,几乎一定存在另一条“暗藏”的鱼,而这两条鱼得出的删数结论还是一致的。仍以刚才的图8-1为例,现在我在上面找到了另一条鱼:
其中浅紫色是一开始找到的二链列,深紫色是现在找到的三链列。它们的删数都是r2c3的2。
这是巧合吗?我想不是,但本人并无能力给出严密的证明。
小结:
(1)鱼是一种基于同种候选数的排列组合而产生删数的系列技巧。
(2)对于标准鱼来说,定义域是一个n行(列)的区域,涵盖某种候选数,并保证这些候选数只分布在n列(行)上;删数域是垂直于定义域,且贯穿(但不包含)鱼身的区域。定义域和删数域的行/列数相等。
(3)残缺并不意味着鱼本身不成立,它只是标准鱼的一种表现形式。
(4)标准鱼具有互补性。
思考:
(1)为什么规定定义域的行/列数与删除域的列/行数相等?如果定义域行/列数多于或少于删除域列/行数,会发生什么?
(2)如果某种候选数还有n(n≥4)个未填入盘面,且该候选数存在一条m(m<n-1)阶鱼,那么它的互补鱼是几阶的?