鱼类技巧

交叉

当 显单 和 隐单 无法继续推进时,我们需要更高级的技巧。 交叉 (Intersection)是一个非常实用的初级技巧。

交叉 是利用一个候选数在两个相交的区域中的所在位置,来消除候选数的技巧。

交叉通常分为两种情况: 交叉消除行/列 (Pointing)和 交叉消除宫 (Claiming)。

交叉其实就是1级鱼,也就是独眼鱼(Cyclopsfish)技巧,是鱼类家族中最简单的一种。因为根据行列与宫之间的相交关系进行消除,所以也称为交叉。

交叉消除行/列

当候选数在一个宫中只出现在同一行(或同一列)时,根据数独规则,这些格子中的一个必须填写这个数字,所以可以消除在这一行(或这一列)的其他格子中的该候选数。

交叉消除列示例

这是一个 交叉消除列 的示例,图中 宫6 (蓝色区域)中的候选数 6 ,只出现在 列G (绿色区域)中,所以,我们知道格子 G4 、 G5 中必然有一个填 6 ,所以, 列G 中其它格子中的候选数 6 可以消除。

交叉消除行示例

这是一个 交叉消除行 的示例,图中 宫7 (蓝色区域)中的候选数 7 ,只出现在 行8 (绿色区域)中,所以,我们知道格子 B8 、 C8 中必然有一个填 7 ,所以, 行8 中其它格子中的候选数 7 可以消除。

使用方法

  1. 选一个宫,看某个候选数出现的格子
  2. 如果所有格子都在同一行或同一列
  3. 消除该行/列其它格子中的相同候选数

交叉消除宫

当候选数在一行(或一列)中只出现在同一个宫内时,根据数独规则,这些格子中的一个必须填写这个数字,所以可以消除在该宫其他格子中的这个候选数。

交叉消除宫示例

图中 行3 (蓝色区域)中的候选数 8 ,只出现在 宫3 (绿色区域)中,所以,我们知道格子 H3 、 I3 中必然有一个填 8 ,因此, 宫3 中其他格子中的候选数 8 可以消除。

交叉消除宫列示例

图中 列D (蓝色区域)中的候选数 7 ,只出现在 宫8 (绿色区域)中,所以,我们知道格子 D7 、 D8 、 D9 中必然有一个填 7 ,因此, 宫8 中其他格子中的候选数 7 可以消除。

使用方法

  1. 选一行或一列,看某个候选数出现的格子
  2. 如果所有格子都在同一个宫内
  3. 消除该宫其它格子中的相同候选数

基础鱼

总览

鱼 (Fish)是数独中级水平必须掌握的核心技巧,在解题时经常能发挥关键作用。

和 隐集 类似, 鱼 也是通过观察候选数在 区域 中的分布来消除候选数。不同之处在于, 鱼 技巧需要观察两组相交的 区域 ,我们把它们分别称为 基础区域 (Base Regions)和 覆盖区域 (Cover Regions)。

鱼 技巧根据 基础区域 的数量来划分等级 n ,下面我们通过具体例子来学习。

独眼鱼

独眼鱼 (Cyclopsfish)是 鱼 n = 1 的情况。也就是 1 个 基础区域 中候选数所出现的格子,被 1 个 覆盖区域 覆盖。

其实独眼鱼就是我们之前学过的交叉,具体来说,可能是交叉消除行、交叉消除列或交叉消除宫。

独眼鱼示例1

图中候选数 4 在 基础区域 列G (蓝色区域)中出现的格子为 {G4, G5} (图中为绿色候选数),全部被 覆盖区域 宫6 (绿色区域)覆盖。

独眼鱼 消除候选数的原理是什么?

可以这样理解:候选数 4 在 基础区域 中出现的位置,全部都在 基础区域 和 覆盖区域 的交集里(也就是格子 {G4, G5, G6} )。

根据数独规则,每个区域都必须填写 1 个 4 。因为 基础区域 列G 中的 候选数 4 只出现在交集格子里,所以交集里必定要填写 1 个 4 。

同样, 覆盖区域 宫6 里也必须要填写 1 个 4 。既然交集里已经填写 1 个 4 了,那么 宫6 中其他格子就不能再填 4 ,所以 宫6 中其他格子的候选数 4 可以消除。

推广

上面的消除逻辑可以推广到 n 个 基础区域 和 n 个 覆盖区域 的情况。假设候选数为 x 。

鱼 的一般定义:

对于一个候选数 x ,如果它在 n 个 同类型 (不相交)的 基础区域 中出现的格子,全部都被另外 n 个 同类型 (不相交)的 覆盖区域 覆盖,这种模式就称为 鱼 。

鱼 的一般消除逻辑:

根据数独规则, n 个 基础区域 中必须填写 n 个 x ,而候选数 x 都出现在 基础区域 和 覆盖区域 的交集里,所以交集里要填写 n 个 x 。

同样, n 个 覆盖区域 中也必须填写 n 个 x 。既然交集里已经填写 n 个 x 了,那么 覆盖区域 中交集外的格子就不能再填 x ,所以 覆盖区域 中交集外的格子中的候选数 x 可以消除。

这就是鱼的核心逻辑,下面我们来看更多例子。

X翼

X翼 (X-Wing)是 鱼 n = 2 的情况。

X翼示例1

图中候选数 5 在 基础区域 行3 和 行5 (蓝色区域)中出现的格子,全部被 覆盖区域 列C 和 列E (绿色区域)覆盖。

也就是说候选数 5 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {C3, E3, C5, E5} 里。

因此, 覆盖区域 中交集外的格子不能填 5 。所以 C6 和 E6 中的候选数 5 可以消除。

X翼示例2

图中候选数 4 在 基础区域 列E 和 列H (蓝色区域)中出现的格子,全部被 覆盖区域 行3 和 行4 (绿色区域)覆盖。

也就是说候选数 4 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {E3, H3, E4, H4} 里。

因此, 覆盖区域 中交集外的格子不能填 4 。所以 A3 、 B3 和 C3 中的候选数 4 可以消除。

箭鱼

箭鱼 (Swordfish)是 鱼 n = 3 的情况。

箭鱼示例1

图中候选数 1 在 基础区域 行2 、 行4 和 行7 (蓝色区域)中出现的格子,全部被 覆盖区域 列B 、 列E 和 列G (绿色区域)覆盖。

也就是说候选数 1 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {B2, E2, G2, B4, E4, G4, B7, E7, G7} 里。

因此, 覆盖区域 中交集外的格子不能填 1 。所以 G3 中的候选数 1 可以消除。

箭鱼示例2

图中候选数 9 在 基础区域 行3 、 行5 和 行7 (蓝色区域)中出现的格子,全部被 覆盖区域 列C 、 列E 和 列I (绿色区域)覆盖。

也就是说候选数 9 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {C3, E3, I3, C5, E5, I5, C7, E7, I7} 里。

因此, 覆盖区域 中交集外的格子不能填 9 。所以 I2 、 C6 、 E6 和 C9 中的候选数 9 可以消除。

水母

水母 (Jellyfish)是 鱼 n = 4 的情况。

水母示例1

图中候选数 1 在 基础区域 行1 、 行4 、 行5 和 行7 (蓝色区域)中出现的格子,全部被 覆盖区域 列B 、 列C 、 列G 和 列I (绿色区域)覆盖。

也就是说候选数 1 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {B1, C1, G1, I1, B4, C4, G4, I4, B5, C5, G5, I5, B7, C7, G7, I7} 里。

因此, 覆盖区域 中交集外的格子不能填 1 。所以 C2 和 I8 中的候选数 1 可以消除。

水母示例2

图中候选数 6 在 基础区域 行3 、 行5 、 行6 和 行8 (蓝色区域)中出现的格子,全部被 覆盖区域 列B 、 列C 、 列F 和 列I (绿色区域)覆盖。

也就是说候选数 6 在 基础区域 中只出现在 基础区域 和 覆盖区域 的交集 {B3, C3, F3, I3, B5, C5, F5, I5, B6, C6, F6, I6, B8, C8, F8, I8} 里。

因此, 覆盖区域 中交集外的格子不能填 6 。所以 B4 和 C7 中的候选数 6 可以消除。

带鳍鱼

总览

带鳍鱼 (Finned Fish)是普通 鱼 技巧的一种变体。

在寻找 鱼 模式时,有时 覆盖区域 无法完全覆盖 基础区域 中的所有候选数。这些没被覆盖的候选数就叫 鳍 (Fin),含有 鳍 的格子我们称为 鳍格子 (Fin Cell)。我们仍然有可能消除候选数。

带鳍X翼

让我们通过一个例子来学习 带鳍鱼 技巧。

带鳍X翼示例1

图中, 基础区域 (蓝色区域)是 行4 和 行9 , 覆盖区域 (绿色区域)是 列B 和 列F ,候选数是 7 。我们观察到 E9 中的候选数 7 (蓝色候选数)虽然在 基础区域 中,却没被覆盖。

这种在 基础区域 中未被覆盖的候选数就叫 外鳍 (Exo Fin),是 鳍 (Fin)的一种。

那怎么消除呢?我们可以这样理解:

第一种情况:如果所有 鳍格子 都不填 7 ,那这就是一个普通的 X翼 ,按正常方式消除橘色和红色的候选数。

第二种情况:如果 鳍格子 里至少有一个填 7 ,那么,任何能同时看到所有 鳍格子 的格子,里面的 7 都可以消除。

这两种情况总有一个是对的。所以,能被两种情况同时消除的 7 ,肯定可以去掉。

简单说,就是普通 鱼 要消除候选数的格子中,那些能同时看到所有 鳍格子 的格子,里面的 7 可以消除。

因此, F8 中的 7 可以消除,因为 F8 既是普通 X翼 要消除候选数的格子,又能看到唯一的 鳍格子 {E9} 。

我们再看第二个例子。

带鳍X翼示例2

图中, 基础区域 (蓝色区域)是 列C 和 列F , 覆盖区域 (绿色区域)是 行6 和 行8 ,候选数是 2 。 C5 中的候选数 2 (蓝色候选数)未被覆盖,成为 鳍 。

普通消除会去掉 A8 和 A6 中的 2 (橘色和红色候选数)。其中只有 A6 能看到唯一的 鳍格子 {C5} ,所以 A6 中的 2 可以消除。

带鳍箭鱼

带鳍箭鱼示例1

图中, 基础区域 (蓝色区域)是 列B 、 列G 和 列I , 覆盖区域 (绿色区域)是 行3 、 行4 和 行8 ,候选数是 2 。 {G5, I5, G6} 中的候选数 2 (蓝色候选数)未被覆盖,成为 鳍 。

普通消除会去掉 {E3, F3, H3, C4, H4} 中的 2 (橘色和红色候选数)。其中只有 H4 能同时看到所有 鳍格子 {G5, I5, G6} ,所以 H4 中的 2 可以消除。

带鳍箭鱼示例2

图中, 基础区域 (蓝色区域)是 行1 、 行3 和 行8 , 覆盖区域 (绿色区域)是 列B 、 列F 和 列H ,候选数是 4 。 {E1, D3} 中的候选数 4 (蓝色候选数)未被覆盖,成为 鳍 。

普通消除会去掉 {F2, F5, F7, B9, F9} 中的 4 (橘色和红色候选数)。其中只有 F2 能同时看到所有 鳍格子 {E1, D3} ,所以 F2 中的 4 可以消除。

带鳍水母

带鳍水母示例1

图中, 基础区域 (蓝色区域)是 行1 、 行4 、 行6 和 行8 , 覆盖区域 (绿色区域)是 列B 、 列D 、 列F 和 列H ,候选数是 3 。 {G4, I6} 中的候选数 3 (蓝色候选数)未被覆盖,成为 鳍 。

普通消除会去掉 {B2, F2, H2, B3, D3, F3, H3, F5, H5, D7, D9, H9} 中的 3 (橘色和红色候选数)。其中只有 H5 能同时看到所有 鳍格子 {G4, I6} ,所以 H5 中的 3 可以消除。

变异鱼(选学)

我们将在未来添加关于 变异鱼 的内容。

鱼技巧理论(选学)

看的定义

当两个格子c1c_1 和 c2c_2,c1≠c2c1 \ne c2,同时属于区域RR时,我们称c1c_1可以看到c2c_2, 且c2c_2可以看到c1c_1,或者说c1c_1和c2c_2相互可见。

注意,在我们的定义中,一个格子不可以看到自己。

基础鱼的定义

基础鱼 是指对于候选数 kk ,存在一个区域集合(基础区域)R基础R_{基础}(里面的区域不相交),kk 在 R基础R_{基础} 中所在格子集为 C基础C_{基础} 。存在另外一个区域集合(覆盖区域)R覆盖R_{覆盖}(里面的区域不相交),kk 在 R覆盖R_{覆盖} 中所在格子集合为C覆盖C_{覆盖}。且 ∣R基础∣=∣R覆盖∣|R_{基础}| = |R_{覆盖}|,且 C基础⊂C覆盖C_{基础} \subset C_{覆盖} ,则这个形式称为鱼。

之所以称为基础鱼,是因为要求基础区域之间不相交,覆盖区域之间不相交,且要求覆盖区域需要覆盖所有基础区域中的 kk 。这些条件都不是必须满足的。

基础鱼技巧的证明

命题 :对候选数 kk ,存在基础区域集合 R基础R_{基础} 和覆盖区域集合 R覆盖R_{覆盖}形成鱼(简单),设 kk 所在的格子集合分别为 C基础C_{基础} 和 C覆盖C_{覆盖} ,则C覆盖∖C基础C_{覆盖} \setminus C_{基础}中的候选数 kk 可以消除。

证明 :

设 n=∣R基础∣n = |R_{基础}|

根据数独规则,数字 kk 在每个区域中都需要正好填写一次。

因为 R基础R_{基础} 中有 nn 个相互不相交的区域,所以,R基础R_{基础} 中正好要填写 nn 个 kk ,也就是 C基础C_{基础} 中正好要填写 nn 个 kk 。

同理可知 C覆盖C_{覆盖} 中也正好要填写 nn 个 kk 。

而 C基础⊂C覆盖C_{基础} \subset C_{覆盖} ,所以我们知道,kk 不可能填写在 C覆盖∖C基础C_{覆盖} \setminus C_{基础} 中。

所以 C覆盖∖C基础C_{覆盖} \setminus C_{基础} 中的候选数kk可以消除。

一般鱼定义

一般鱼 是指对于候选数 kk ,存在一个区域集合(基础区域)R基础R_{基础},kk 在 R基础R_{基础} 中所在格子集为 C基础C_{基础} 。存在另外一个区域集合(覆盖区域)R覆盖R_{覆盖},kk 在 R覆盖R_{覆盖} 中所在格子集合为C覆盖C_{覆盖}。且 ∣R基础∣=∣R覆盖∣|R_{基础}| = |R_{覆盖}|,则这个形式称为鱼。

一般和基础鱼的区别主要是,基础区域允许相交,覆盖区域允许相交,且没有 C基础⊂C覆盖C_{基础} \subset C_{覆盖} 的条件。

一般鱼技巧的证明

命题 :对候选数 kk ,存在基础区域集合 R基础R_{基础} 和覆盖区域集合 R覆盖R_{覆盖}形成一般鱼。

设 kk 在 R基础R_{基础} 和 R覆盖R_{覆盖} 中所在的格子集合分别为 C基础C_{基础} 和 C覆盖C_{覆盖} 。

设 C外鳍=C基础∖C覆盖C_{外鳍} = C_{基础} \setminus C_{覆盖}。

设 C内鳍C_{内鳍} 为所有C基础C_{基础}中存在于多个基础区域中的格子集。

设 C自噬C_{自噬}为C覆盖C_{覆盖}中存在于多个覆盖区域中的格子集。

设 C鳍=C外鳍∪C内鳍C_{鳍} = C_{外鳍} \cup C_{内鳍} 。

设 C预消=(C覆盖∖C基础)∪C自噬C_{预消} = (C_{覆盖} \setminus C_{基础}) \cup C_{自噬} 。

设 C看鳍C_{看鳍} 表示所有能同时看到 C鳍C_鳍 的格子的格子集

若 C鳍=0C_{鳍} = 0,则可以消除 C预消C_{预消} 中的 kk 。

若 C鳍≠0C_{鳍} \ne 0,则可以消除 C预消∩C看鳍C_{预消} \cap C_{看鳍} 的格子中的 kk 。

证明 :

设 n=∣R基础∣n = |R_{基础}|

情况 1: 假设 kk 不填写在 C鳍C_{鳍} 中

根据数独规则,每个区域正好需要填写1个 kk

因为 kk 不填写在 C鳍C_{鳍} 中,所以 kk 所填写的格子都只属于1个基础区域(也就是不属于任何两个基础区域之间的交集)

所以,C基础C_{基础} 中正好要填写 nn 个 kk。

因为 C鳍C_{鳍}中没有填写 kk,

所以,C覆盖C_{覆盖} 实际覆盖了 C基础C_{基础} 中填写 kk 的格子

所以 C覆盖C_{覆盖} 中至少填写 nn 个 kk 。

而根据数独规则,显然 C覆盖C_{覆盖}中最多填写∣C覆盖∣=n|C_{覆盖}| = n 个 kk

所以 C覆盖C_{覆盖} 正好填写了 nn 个 kk。

所以 C覆盖C_{覆盖} 中填写的 kk 的格子不可能填写在 C自噬C_{自噬} 中(即不可能填写在任何两个覆盖区域的交集),否则 C覆盖C_{覆盖}中填写的 kk的个数达不到 nn。

所以可以消除 C自噬C_{自噬} 中的 kk 。

另外 C覆盖∖C基础C_{覆盖} \setminus C_{基础} 中也不可能填写 kk,否则它们两个中填写的 kk的数量不可能相等

所以可以消除 C覆盖∖C基础C_{覆盖} \setminus C_{基础} 中的 kk

所以,合并得

(C覆盖∖C基础)∪C自噬=C预消 (C_{覆盖} \setminus C_{基础}) \cup C_{自噬} = C_{预消} 中的 kk 可以消除

情况 2: 假设 kk 在C鳍C_鳍中至少填写1次

则所有 C看鳍C_{看鳍} 中的kk可以消除

综合以上两种情况:

若 C鳍=0C_鳍 = 0,则以上第2种情况是不可能的,只可能是第1种情况,所以,C预消C_{预消} 中的 kk 可以消除。

若 C鳍≠0C_鳍 \ne 0,

如果一个格子同时属于 C预消C_{预消} 和 C看鳍C_{看鳍},则这个格子中的 kk 无论在以上哪种情况下都可以被消除

即 C预消∩C看鳍C_{预消} \cap C_{看鳍} 中的 kk 可以消除