← 数独解题技巧 / 中级技巧:翼、鱼与唯一矩形 待审核 2 / 4
中级 · XY-Wing / fish / UR

中级技巧:翼、鱼与唯一矩形

基础层的六招用尽后,盘面仍可能一步也推不动。本章的四组技巧不再逐格扫描,而是先认出一个图形——三个双值格连成的连环、若干行列织成的网、四角排成的矩形——再由图形整体推出删数。

它们的共同形态是分情况讨论:枚举图形允许的几种摆法,取所有情况都成立的那部分结论。这也是它们比基础层难认的原因:得先看见形状,才能开始推。

1 · XY-Wing:三个双值格连成的连环

只剩两个候选的格称为双值格(bivalue cell)。XY-Wing 用三个双值格:一个枢纽(pivot)候选为 {X,Y},两个(pincer)各看得见枢纽、各与它共享一个数,并共有同一个第三数 Z——一个是 {X,Z},一个是 {Y,Z}。

枢纽只有两种可能,逐一推:

  • 枢纽 = X → 与它共享 X 的那个翼 {X,Z} 不能再是 X → 只能是 Z
  • 枢纽 = Y → 与它共享 Y 的那个翼 {Y,Z} 不能再是 Y → 只能是 Z

两条路各逼出一个翼等于 Z,所以「Z 落在某个翼上」是必然的。任何同时被两翼看见的格,都不可能再是 Z。

图 1-1 · 枢纽候选为 5 与 8,两翼分别是「1 与 5」「1 与 8」,共有的第三数是 1;同时看见两翼的格删去 1。可单步观察两种情况如何殊途同归。

同族还有 XYZ-Wing(枢纽变成三值 {X,Y,Z})与 W-Wing。XY-Wing 也可以看成一条最短的:翼₁ — 枢纽 — 翼₂;把这种「或此或彼」的推理拉成任意长,就是下一章的内容。

2 · Swordfish:X-Wing 的 3×3 版

X-Wing 是「2 行 × 2 列」的鱼,放大一号就是 Swordfish——「3 行 × 3 列」。某个数字在三行里的落点全被关进同样的三列(每行两到三个,合起来恰好用满这三列),那么这三行会把这三列的该数字各占一个、用得干干净净,于是这三列里其它行的它统统可删。

图 2-1 · 数字 3 在第 2、3、9 行的落点全压在第 4、7、8 列上,三列其余行的 3 因此被删。可单步观察三行如何把三列用光。
fish 家族是同一句话的放大:n 行里某数只占 n 列,那 n 列里其它行的它全删(行列对调亦成立)。
名字 规模 逻辑
X-Wing 2 行 × 2 列 某数在 2 行只落 2 列
Swordfish 3 行 × 3 列 某数在 3 行只落 3 列
Jellyfish 4 行 × 4 列 某数在 4 行只落 4 列

再大就没有必要:五链列及以上都能被与它正交的、更小的鱼完全替换,所以鱼的家族实际到 Jellyfish 为止。Swordfish 的宽松之处在于每行不必都正好两个落点,只要三行的列合起来不超过三列。

3 · 进阶鱼:鳍、退化、宫内、交叉

实战里完美的鱼并不多见,更常碰到「差一点」或「多一点」的鱼。先统一描述一条鱼的四个部件,仍然只盯单个数字 X:

  • 定义域(base set)——产生鱼的那组 house(如 X-Wing 的两行),X 被关在这组里。
  • 删除域(cover set)——用来覆盖、并执行删数的那组 house(如对应的两列)。
  • 鱼身(body)——定义域里 X 的全部落点。
  • (fin)——鱼身之外、定义域内多出来的 X。它让删除域缩小,而非整条 house 地删。

一条规整鱼要求定义域 house 数等于删除域 house 数,且每个 house 内至少两个落点。残缺(incompleted)指鱼缺了某个角,但只要每个 house 仍有两个以上落点,推理不受影响、删除域不变。

带鳍鱼:多出一格会怎样

这是理解所有变异鱼的入口。抓住两种可能,二选一必成立:

  • 情况 A——鳍其实是空的:那就是一条干净的 X-Wing,按规整鱼删掉整条删除域里其它行的该数。
  • 情况 B——鳍就是该数:那它会清掉自己所在里其它格的该数。

要删一个候选,得在两种情况下都被删才安全。两者的交集是「删除域 ∩ 鳍所在宫」——这就是带鳍鱼的核心:鳍把删除域从整条 house 收缩到 house 与鳍宫的交集。看不到鳍的那些格,在情况 B 下保不住,因此全部保留。

图 3-1 · 第 1 行与第 5 行本可凑成 X-Wing,第 5 行多出的那枚 7 是鳍;求两种情况的交集后,真正被删的只剩第 5 列与第 5 宫相交的两格。可单步观察删除域如何收缩。

鳍必须落在定义域内、且与鱼的某个顶点处在同一个宫;鳍可以不止一枚,但所有鳍必须同处一个宫,这样情况 B 才收敛到单宫。Swordfish、Jellyfish 同样能带鳍,逻辑完全一致。

退化、宫内、交叉与自噬

把带鳍鱼再省一步:若离鳍最近的那条腿不见了,剩下的鱼身已不足以单独构成 X-Wing,这叫退化(degenerated)。退化鱼不能独立成立,但仍能与鳍合起来推理——这种「外鳍 + 退化鱼」的结构英文叫 Sashimi Fish。注意与残缺区分:残缺是缺角但仍能独立推理、删除域不变;退化是缺腿后必须靠鳍。当一枚鳍可以和鱼身的某个位置互换身份、两种读法都能删数时,称为共轭鱼(Siamese Fish)。

定义域也不必全是行或全是列。把规整鱼里的某条行换成一个宫,只要该数仍被关在定义域内,鱼依然成立——这是宫内鱼(Franken Fish)。它引出一种新的鳍:当定义域内部出现自重叠(如一条行与一个宫共用了某些格),重叠处要算两次,既是鱼身又是鳍,称为内鳍(endo fin);它同样把删除域收缩到与内鳍所在宫的交集,交集为空时这条鱼只在理论上成立。

当定义域或删除域里同时含有行和列,就不再是宫内鱼而是交叉鱼(Mutant Fish)。它有一句口诀:行列必交叉,交叉必删宫——前半句是定义,后半句是删法:行与列的交叉点所在的那个宫也并入删除域。

前面的重叠都发生在定义域。当删除域发生重叠、且重叠处恰好压在鱼身的某个落点上时,这个属于鱼身的候选会被自己的结构删掉,称为自噬(cannibalism)。交叉鱼的删除域天然容易在行、列、宫的交点处重叠,因此自噬在交叉鱼里尤其常见。

变异鱼速查:形状在变,推理主线不变——先认定义域与删除域,再看鳍把删除域收缩到哪。
变型 英文 触发特征 删除域如何变
残缺 Incompleted 鱼缺角,各 house 仍有 2 个以上落点 不变,照常删
外鳍 Finned 定义域多出鳍,鳍与某顶点同宫 缩为删除域 ∩ 鳍宫
退化 Sashimi 缺腿后必须靠鳍才能推 同外鳍,缩为鳍宫交集
共轭 Siamese 鳍可与鱼身某格互换 给出两组删除
宫内 Franken 定义域或删除域含「宫」 行与宫互换后重算覆盖
内鳍 Endo Fin 定义域内部自重叠,鳍算两次 缩为删除域 ∩ 内鳍宫
交叉 Mutant 定义域行列并存 交叉点所在宫并入删除域
自噬 Cannibalistic 删除域重叠处压在鱼身上 鱼身那个候选被自删

4 · Unique Rectangle:用「答案只有一个」反推

本系列其它技巧都只依据规则本身。唯一矩形第一次动用一条元规则:一道合格的数独解必须唯一。设想四个格排成矩形——在两行、两列、恰好横跨两个宫——如果它们的候选最后都变成同样的两个数 {X,Y},那把这四格里的 X、Y 全部对调,会得到另一个同样合法的解。两个解与「解唯一」矛盾,所以这种致命模式(deadly pattern)绝不允许出现;反过来用它,就能删候选。

「跨两宫」是硬条件:四角占两行两列时,行与列的约束在对调后自动满足,唯一可能被破坏的是宫。四角若恰好落在两个宫里(每宫各两角),对调后每个宫里 X、Y 仍各一次,约束不破,两个解才真的成立。

图 4-1 · 右下四格排成矩形,三格候选已是「3 与 7」;若 roof 也坍缩成这两个数便出两解,故删去它的 3 与 7。可单步观察反证如何成立。

同一条反推随四角多出来的候选形态不同,衍生出一整族类型。术语沿用上文:候选恰好剩 {X,Y} 的角叫 floor,多挂额外候选的角叫 roof

Type 1 · 单角多余候选

三角是 floor {X,Y},只有一角(roof)多挂额外候选 Z。若 roof 也只剩 {X,Y},四角就成致命模式。 → roof 删去 X、Y,只能填额外候选。(图 4-1 演示的就是这型)

Type 2 · 两 roof 同一个多余候选

两 floor 是 {X,Y},两 roof 都多挂同一个 Z。要避开致命模式,这两 roof 不能同时不是 Z → 必有一个是 Z。 → 同时看得见这两 roof 的其它格删 Z。

Type 3 · 两 roof 不同多余候选 → 虚拟数对

两 roof 多挂的是两个不同的额外候选 ab。其中必有一个为真,于是这两 roof 合起来等价于一个候选为 {a,b}虚拟格。 它与同 house 里另一个 {a,b} 双值格凑成 naked pair(扩成三元则是 triple)。 → 该 house 其它格删 a、b。

Type 4 · roof 一侧是 conjugate 强链

两 roof 共处一个 house,而 Y 在这个 house 里只剩这两格能填(对 Y 构成 conjugate 强链)→ 必有一格是 Y。 那两 roof 就不能同时填 X(否则致命模式回来)。 → 两 roof 都删 X。

Type 5 · 对角两格多余候选

和 Type 2 同理,只是多挂同一个 Z 的两格落在对角(而非同行 / 列)。这两格仍不能同时不是 Z → 必有一个是 Z。 → 同时看得见这两个对角格的其它格删 Z。

Type 6 · X 在矩形上构成 X-Wing

四角都已是 {X,Y},而 X 在矩形的两条边上都是 conjugate 强链(即四角对 X 恰好构成一个 X-Wing)。 沿强链推下去,对角一组角填 X 会补全致命模式。 → 对角两角删 X,定为 Y。

Hidden Unique Rectangle · 隐形唯一矩形

不要求四角显式都是 {X,Y}:三角是双值 {X,Y},第四角还挂着别的候选。 若 Y 沿这角的行与列都对那三角构成 conjugate 强链,则第四角一旦填 X,强链会把另外三角逼回 {X,Y} → 补全致命模式。 → 第四角删 X。形态藏在强链里,故称「隐形」。

BUG + 1 · 双值泛墓地

不是矩形,但同样靠「解唯一」。若盘面残局里每个空格都恰好剩 2 个候选,只有一格剩 3 个——这种全双值的「BUG 态」会让每个数字在每个 house 里都出现偶数次,意味着候选可两两对调 → 两个解。 要打破它,只能落在那个三值格上:它在某个 house 里出现 3 次(奇数)的那个候选必为真。 → 三值格删去另外两个候选,定为出现奇数次的 Z。

这些类型共享同一个内核:四角不能恰好坍缩成同一对 {X,Y}。区别只在多出来的候选长什么样、靠什么强链锁住——单角多余(Type 1)、双 roof 同候选(Type 2 与对角的 Type 5)、双 roof 异候选凑数对(Type 3)、conjugate 强链(Type 4、6 与 Hidden),以及不依赖矩形但同源的 BUG。实战里 Type 1 到 3 最常见,4 以后偏少但能直接破开僵局。

警示 · 唯一矩形假设了「这道题出得规范、只有一个解」。少数严格的玩家不接受这种元推理,认为应当只用棋盘本身的逻辑;对绝大多数标准谜面它完全成立,但它的依据确实与其它技巧不同——多了「出题人保证唯一解」这条额外信息。

5 · 相关链接