鱼类技巧

基础鱼

总览

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

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

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

独眼鱼

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

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

独眼鱼示例1

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

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

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

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

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

推广

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

的一般定义:

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

的一般消除逻辑:

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

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

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

X翼

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

X翼示例1

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

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

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

X翼示例2

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

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

因此, 覆盖区域 中交集外的格子不能填 4 。所以 A3B3C3 中的候选数 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 。所以 I2C6E6C9 中的候选数 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 。所以 C2I8 中的候选数 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 。所以 B4C7 中的候选数 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 ,候选数是 2C5 中的候选数 2 (蓝色候选数)未被覆盖,成为

普通消除会去掉 A8A6 中的 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_1c2c_2c1c2c1 \ne c2,同时属于区域RR时,我们称c1c_1可以看到c2c_2, 且c2c_2可以看到c1c_1,或者说c1c_1c2c_2相互可见。

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

基础鱼的定义

基础鱼 是指对于候选数 kk ,存在一个区域集合(基础区域)R基础R_{基础}(里面的区域不相交),kkR基础R_{基础} 中所在格子集为 C基础C_{基础} 。存在另外一个区域集合(覆盖区域)R覆盖R_{覆盖}(里面的区域不相交),kkR覆盖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_{基础} 中正好要填写 nnkk ,也就是 C基础C_{基础} 中正好要填写 nnkk

同理可知 C覆盖C_{覆盖} 中也正好要填写 nnkk

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

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

一般鱼定义

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

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

一般鱼技巧的证明

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

kkR基础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_{看鳍} 表示所有能同时看到 CC_鳍 的格子的格子集

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

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

证明

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

情况 1: 假设 kk 不填写在 CC_{鳍}

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

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

所以,C基础C_{基础} 中正好要填写 nnkk

因为 CC_{鳍}中没有填写 kk

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

所以 C覆盖C_{覆盖} 中至少填写 nnkk

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

所以 C覆盖C_{覆盖} 正好填写了 nnkk

所以 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: 假设 kkCC_鳍中至少填写1次

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

综合以上两种情况:

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

C0C_鳍 \ne 0

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

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