# 数独初介绍

Welcome to Sudoku!

欢迎阅览本教程。本教程旨在讲解所有数独技巧/解法的推理逻辑，让你在做题的时候清楚地认识数独的必要特征，以及如何获取到 100% 正确的推导结论，帮助你“掷地有声”地完成题目，并且能够全身心投入逻辑推理之中，感受数独通过思维运动所带来的快乐。

本教程内容繁多，因此非常不建议你跳内容阅读本教程，否则后面的内容可能无法理解，因为它……真的很难。

本教程尚不支持其他语言版本。不过后续我会考虑将其翻译成英语版本。敬请期待。

## 数独规则 <a href="#rules-of-sudoku" id="rules-of-sudoku"></a>

<figure><img src="/files/ymWzKuF1dPBUsRTNYoUl" alt="" width="375"><figcaption><p>一个样例盘面</p></figcaption></figure>

如图所示。我们可以看到，整个游戏会使用 9 × 9 一共 81 个单元格，我们将整个游戏棋盘称为一个**盘面**（Grid）。

> 从这里开始，所有加粗的文字都是术语。他们都会被我列在[术语列表](/appendix/01-terms)里提供查看。

数独游戏规定，我们在数字 1 到 9 里选取 9 组完整的 1 到 9，并填入到盘面里，并使得每一个横排、每一个竖列，以及每一个由粗线围起来的 3 × 3 的小区域里，都完整包含一套 1 到 9。换言之，任意的数字都不可产生重复项，就像是图上那样。

只是说，你需要完整完成一道题，使得全部的空格都填满数字。图示只给出了其中第 5 行、第 5 列和第 5 个“小宫格”里满足需求的情况。

## 术语介绍 <a href="#terms-list" id="terms-list"></a>

下面简要介绍一下数独需要掌握的基本的术语词汇。

* **行**（Row）：一个横排。一共包含 9 个格子。一个数独盘面包含 9 个行。
* **列**（Column）：一个竖列。一共包含 9 个格子。一个数独盘面包含 9 个列。
* **宫**（Block 或 Box）：一个 3 × 3 的、由粗线围起来的 9 个格子。一个数独盘面包含 9 个宫。
* **单元格**（Cell）：一个格子。一般也简称**格子**或**格**。
* **空格**（Empty Cell）：一个没有填数的空白格子。

这些术语都是基础词汇，需要掌握；后续的教程内容也会使用这些词语来简化表达的内容。

## 一些要求 <a href="#requirements" id="requirements"></a>

在完成一个数独题目的时候，我们会有一些基础的信息作为辅助，并非上手就给玩家完成。

<figure><img src="/files/9eCchd4SJiaYQlbpKtEc" alt=""><figcaption><p>一个题，和它的答案</p></figcaption></figure>

如图所示，左边的图是这个题目，而右边这个是它的答案。我们也叫它**解**（Solution）。可以看出，一个题是必须拥有一些合适的填数作为初始提示项，才能完成的；如果是空白的盘面的话，是无论如何都没有任何依赖项可提供推演提示的。我们把左边初始状态就给出的数字称为**提示数**或**已知数**（Given）。

具有一定的提示数是必要的，但提示数的多少不一定代表题目的难度等级。更多的提示数可能也挺难，而更少的提示数也可以更容易。这一点尤为反直觉，不过我打算以后对这一点再作说明，因为零基础的我们并不一定能接受这个抽象的说法。

另外，一般一个题给予的提示数都会引导我们填出一个合适的解。换言之，一个题如果是一个合格的题目，那么它第一个要满足的地方就是“题目具有唯一的解”这一个要求。

例如上面给的这道题，所有空格都只能填入和右图里完全一致的填数。也就是说，每一个空格都只会最终对应一个正确的填数，所有不是这个数的填数全部都是错误的；反之，一旦我们填错一个数，我们就无法得到整个题目的正确的解。

一般而言，数独题目都具有这两点要求：

* 基础规则：每一个行、列、宫都具有完整的一套数字 1 到 9；
* 唯一解规则：题目只有唯一的一个答案。

后面我们会针对于这两点要求展开说明所有数独的技巧。


# 坐标

Coordinate

下面介绍本教程使用的所有坐标表达的规范。

## 坐标 <a href="#intro-to-coordinates" id="intro-to-coordinates"></a>

所谓**坐标**（Coordinate），指的是表达单元格在盘面里具体位置的一种手段。由于数独游戏在不同国家的文字描述上有所差异，不同国家对坐标的表述方式也有所不同。本文会将全部表达都介绍一次提供以后临时查阅，不过本教程整体只会使用第一种表示方式：[RCB 表示](#rcb-notation)。

我们拿一个题作说明，后续都按这个图里的内容作说明。

<figure><img src="/files/oMm3HNA97UToKbkFdzAJ" alt="" width="375"><figcaption><p>一个例子</p></figcaption></figure>

## RCB <a href="#rcb-notation" id="rcb-notation"></a>

RCB 表示是全球通用的一种表示方法，本教程也会使用这个表示方法。盘面会按第 1 行到第 9 行、第 1 列到第 9 列进行顺次编号。编号次序是从左到右、从上到下。

<figure><img src="/files/6cbaDIofQjfldG04ZJaz" alt="" width="375"><figcaption><p>RCB 表示下的坐标布局</p></figcaption></figure>

我们使用行、列、宫的英文单词首字母 row、column 和 box 的 r、c、b 来表示一个坐标。比如说，正中间的单元格是提示数 2，我们将这个说法直接记为 `R5C5 = 2` 或 `r5c5 = 2`。其中，等号 `=` 体现的是诸如“填入”、“是”等等的含义。不过，b 这个字母暂时用不到，以后用到了会继续说明。

> 正中心的单元格我们有时候也称为**天元**（Tengen）。不过这个词语数独里早期是没有的，为了表述简单，直接借用了围棋的说法来表示中心的概念。为了确保表述的严谨，这里我们直接人为规定，只有第 5 宫里的中心的单元格称为天元。

## K9 <a href="#k9-notation" id="k9-notation"></a>

K9 表示是将坐标用一个字母加一个数字的组合形式表达出来。这样的好处在于简化了 RCB 的书写，但与此同时，字母的次序也会增大表示的复杂度。

<figure><img src="/files/iHQdLVq75prYbQAELD2h" alt="" width="375"><figcaption><p>K9 表示下的坐标布局</p></figcaption></figure>

例如上面的题目，会按照字母 A - I 的次序编号 9 个行，而仍然使用数字 1 - 9 来编号列。那么这样的话，中心单元格（天元）就会被记作 `E5` 或 `e5`。而单元格的提示数是 2 仍然可以用等号连接：`E5 = 2` 或 `e5 = 2`。

不过这里记号使用了字母 C 和 B，这可能在后续讲解的坐标记号规则里与 RCB 表示产生冲突，所以不要混用两种表示方式。或者，由于习惯问题，我们更希望 K9 表示下字母都统一采用大写字母而不是小写，而小写字母的书写机会预留给 RCB 表示，这样可以一定程度上规避歧义性。

> 另外，你可能会好奇，这个记号尚不会用到 K 字母，但名字里却用到了字母 K，这是为什么呢？这其实是因为老外的习惯问题。由于第 9 行的行号用的是字母 I，而大写的 I 字母容易和数字 1 区分不开，所以老外在使用这种坐标时会故意不用 I 这个字母，而是直接顺延到 K。而 J 不用的原因也是因为它和 1 比较像（当然，这取决于一些字体，有些字体的 J 在小写时只是拉长了字母，并没有 J 下方的弯钩）。总之，老外的坐标列表里，第 1 - 9 行的坐标分布其实是 A、B、C、D、E、F、G、H、K，因此用最大的行号第 9 行（K 字母）和最大的列号第 9 列（数字 9）拼凑的 K9 来称呼这个记号，这是这个名字的由来。

## Excel 坐标 <a href="#excel-notation" id="excel-notation"></a>

Excel 表示完全把字母和数字反过来表示，即行用数字，列用字母。

<figure><img src="/files/I1EUNpdvbESUW4WKOF2m" alt="" width="375"><figcaption><p>Excel 表示下的坐标布局</p></figcaption></figure>

例如 Excel 坐标表示的天元仍记为 `E5`。但是这一次是反过来的，即先说的列号，后说的行号。那么第 2 行的第 6 个单元格，前面记作 `r2c6`（RCB 表示）或 `B6`（K9 表示），而这里我们记作 `F2`。

确实是有些绕，所以就不展开说明了。点到即止。


# 历史由来

History of Sudoku

数独演变到如今，中间确实存在不少响当当的人物在让数独更加大众化。下面我们来看看数独究竟是如何演变至今的。

## 规则的由来 <a href="#origin-of-constraints" id="origin-of-constraints"></a>

下面给各位展示数独宫和不重复约束规则的由来。

### 宫规则：法国Le Siècle日报 <a href="#block-rule-growing" id="block-rule-growing"></a>

早在 19 世纪末期，法国的 Le Siècle 日报就发布了一篇填数字的游戏。这种填数字游戏看起来似乎跟目前的数独差不多，但区别也非常大。

<figure><img src="/files/Wm2Bza3rWbAhfNDgOkAZ" alt=""><figcaption><p>该日报上的题</p></figcaption></figure>

> 图源：<https://en.wikipedia.org/wiki/Sudoku>

如图所示，该题目并不包含宫的约束条件，并且它的规则也不同：它要求你在空格里填入 1 到 9，使得每一行、每一列以及两条对角线的填数之和相同。

该规则并没有任何限制额外的填数限制，但你可以看到提示数所在行列似乎填数本身就不重复。因此，这一点给后续产生的数独提供了一些创意。

很显然，从规则求和来看，它来自于一个叫做**幻方**（Magic Square）的阵列。幻方是一种类似的东西，它就刚好要求填数求和一致。但和前文提及的这种填数游戏不同，幻方是一整个盘面内没有要求重复性，而一整个盘面里数字之间不相同，也就是说填数的范围是从 1 到 $$n^2$$。如 6 阶的幻方填入的数字是 1 - 36；3 阶的幻方则是填入 1 到 9。

由于该日报发布的题目规则不同于幻方，因此这并不属于幻方。官方将其称为 Carré Magique Diabolique，英语翻译大概为 Diabolical Magic Square，直译过来是“恶魔般的幻方”。

> 这里 diabolical 有多种理解方式。它的意思是“恶魔一般的”，但也可以翻译为“特别困难的”，即类似于中文的“极难”；也可以翻译成“糟糕透了的”。如何翻译取决于你自己对这种填数游戏的理解。

而它的这个名字则是于 1895 年 7 月 6 号才被固定下来。

早在 1892 年 11 月 19 日，该日报就发布了一则带宫的版本：

<figure><img src="/files/8ivcPqJgc90RIaR43kgy" alt=""><figcaption><p>带宫的版本</p></figcaption></figure>

> 图源：<https://web.archive.org/web/20061210103525/http:/cboyer.club.fr/multimagie/SupplAncetresSudoku.pdf>

但这看起来更不像数独了。因为它填入的数字并不是 1 到 9，而是一个两位数，但规则仍然是求和一致。

唯一和数独有联系的，可能只有这一个宫的约束性质。不过，这一点，确实为数独提供了一个基本的轮廓。这个填数游戏持续了好一阵子，不过大概在第一次世界大战发生的时间前后，就突然基本消失了。

这便是数独带有宫的、可通过文献找到的最早的记录。

### 不重复规则：欧拉的拉丁方和崔锡鼎的九数略 <a href="#no-dupe-rule-growing" id="no-dupe-rule-growing"></a>

另一种说法是来自于**拉丁方**（Latin Square）。也有翻译成拉丁方块和拉丁方阵的。这个东西于 18 世纪就已经出现。

按照一般说法，拉丁方起源自一个叫做**欧拉**（Leonhard Euler）的数学家。实际上，他也不一定非得是数学家，他在别的领域也有研究。不过以本人来看，他创造的拉丁方是以字母作为填空的元素，而非数字。

然后经考证，似乎这个东西的发明另有其人。一位韩国的数学家**崔锡鼎**（Choi Seok-jeong）似乎早于欧拉至少 67 年就制作了拉丁方的相似内容。这个东西当时被称为**九数略**（Gusuryak）。

<figure><img src="/files/C7QIhI1aDgYBfQq9qjfJ" alt=""><figcaption><p>九数略</p></figcaption></figure>

> 图源：<https://web.archive.org/web/20180814135318/https://kyudb.snu.ac.kr/contents/content_detail.do?code=A00074&a_code=A01&b_code=B02&c_code=C24&num=74>

请注意图片的右半部分，它并未标记宫的界限，也就是说这也是一个没有宫的图案，但它却保证了每一个单元格填入的这个两位数字，上面的数字在整个盘面里是一个完整的 9 阶拉丁方规则，而下面也是一样。

另外，图片里提及的“洛书”则实指中国的河图洛书。长下面这样。

<figure><img src="/files/oP6Oz8okK7FsTKahwGjn" alt="" width="224"><figcaption><p>河图洛书</p></figcaption></figure>

> 图源：<https://zh.wikipedia.org/zh-hans/%E6%B2%B3%E5%9C%96%E6%B4%9B%E6%9B%B8>

从图形上来看，中国早已存在对幻方的研究。该图里线条连接的圆点数排布恰为一个 3 阶的幻方：

$$
\begin{matrix}
& & 4 & 9 & 2 & \rightarrow & 15\\
& & 3 & 5 & 7 & \rightarrow & 15\\
& & 8 & 1 & 6 & \rightarrow & 15\\
& \swarrow & \downarrow & \downarrow & \downarrow & \searrow \\
15 & & 15 & 15 & 15 & & 15
\end{matrix}
$$

这是两个广泛被认为是数独的历史文字。

也就是说，崔锡鼎的九数略来自于中国古代的河图洛书，但稍加改良将求和的规则改成了一种不重复的填充规则；而若干年后，欧拉也独立创造出了不重复规则的填充规则。他们互相是没有关系的。

总而言之，数独的宫规则和不重复规则来自于这样两种不同的填数谜题，最终归并到了一起。

## 时间线 <a href="#timeline" id="timeline"></a>

下面为各位总结一下由来的完整时间线。括号里写的来源请参考本文末尾的超链接查看。

{% stepper %}
{% step %}

### 公元前 2200 年——中国 河图洛书 <a href="#in-2200-bc" id="in-2200-bc"></a>

最早形式可追溯到公元前 2200 年，可能来自中国的“河图洛书”。内容请参考前面介绍的部分（来源 1）

之所以说“可能”，是因为它和数独完全不像。唯一一样的地方是洛书转为数字符号时，只用了 1 到 9。这一点作为数独历史由来仍有小范围的争议。
{% endstep %}

{% step %}

### 17 世纪初——朝鲜王朝 崔锡鼎的九数略 <a href="#early-17th-century" id="early-17th-century"></a>

17 世纪由朝鲜时期数学家崔锡鼎出版《九数略》，其填入不重复项的规则是走这个内容演变来的，甚至比欧拉的拉丁方早 67 年出现，详情请参考前文的部分（来源 6）

这一条据说已被证实（来源 7）；但具体出版时间只是提到 1700 年左右。因为广泛认为大概是 1715 年左右出版，所以一般认为是早 67 年（1782 年欧拉发表拉丁方，参考下面这一部分的内容）。
{% endstep %}

{% step %}

### 17 世纪末——瑞士 欧拉的拉丁方 <a href="#late-17th-century" id="late-17th-century"></a>

在 1782 年，瑞士的数学家欧拉提出了拉丁方的概念，即在 $$n \times n$$ 的矩阵里填入 $$n$$ 个符号（这里可以是数字，其实也可以是其他的内容），总之使得每一种符号在任意行和列上都恰好只会出现一次（来源 2）
{% endstep %}

{% step %}

### 19 世纪——法国 报纸计算型数独雏形 <a href="#in-19th-century" id="in-19th-century"></a>

1895 年，法国报纸刊登了近似现代数独的魔方（幻方阵）的变体规则，此时已经可见包含宫的基本规则了（来源 3）
{% endstep %}

{% step %}

### 20 世纪 70 年代——美国 建筑师刊登的数独雏形 <a href="#in-1970s" id="in-1970s"></a>

1979 年，由美国印地安洲的建筑师 Howard Garns 为戴尔杂志创作了 Number Place 的谜题玩法，即现代数独的雏形。这位建筑师的名字也出现在了杂志里，填补部分数字，规则已经和现代的数独标准一样了（来源 2）
{% endstep %}

{% step %}

### 20 世纪 80 年代——日本 引入和命名 <a href="#in-1980s" id="in-1980s"></a>

1984 年，日本 Nikoli 公司出版由**鍜治真起**（Kaji Maki）命名“数独”，来自于句子“数字は独身に限る”，译为“数字唯一”；这位大师不仅推广，还制定了规范化了数独的规则（来源 1）

顺带一说，这位大师因为其推广和投身数独的贡献，被奉为“数独之父”。
{% endstep %}

{% step %}

### 1997 年和 2004 年——日本 新西兰法官推广 <a href="#year-1997-and-2004" id="year-1997-and-2004"></a>

1997 年，新西兰籍的法官**高乐德**（Wayne Gould）在香港担任法官的工作。在他回老家期间，在日本转机的时候发现了数独，于是对此感兴趣，开发了电脑版本的数独出题的程序。

2004 年，他本人说服《泰晤士报》引入数独，随后该游戏风靡英国和欧美报刊（来源 4）
{% endstep %}

{% step %}

### 2006 年——国际化赛事 <a href="#year-2006" id="year-2006"></a>

2006 年，数独游戏开始举办第一场**世界数独锦标赛**（World Sudoku Championship，WSC），吸引了来自多个国家的选手参与，称为全球智力运动的赛事（来源 3）
{% endstep %}

{% step %}

### 现代数独 <a href="#modern-sudoku" id="modern-sudoku"></a>

当今数独以纸笔、app、在线平台等形式多路普及，拥有诸多玩法的变体形式（如杀手数独等）。国际数独日定于每年的 9 月 9 日（来源 5）
{% endstep %}

{% step %}

### 2021 年——鍜治真起去世 <a href="#year-2021" id="year-2021"></a>

2021 年 8 月 10 日，数独之父鍜治真起因胆管癌去世，享年 69 岁。
{% endstep %}
{% endstepper %}

## 参考来源 <a href="#references" id="references"></a>

1. [https://escape-sudoku.com/blog/history-of-sudoku-game](https://escape-sudoku.com/blog/history-of-sudoku-game?)
2. [https://www.sudokuconquest.com/blog/a-brief-history-of-sudoku](https://www.sudokuconquest.com/blog/a-brief-history-of-sudoku?)
3. <https://en.wikipedia.org/wiki/Sudoku>
4. <https://www.gamesver.com/sudoku-the-history-all-you-need-to-know/>
5. <https://nationaltoday.com/international-sudoku-day/>
6. <https://web.archive.org/web/20180814135318/https://kyudb.snu.ac.kr/contents/content_detail.do?code=A00074&a_code=A01&b_code=B02&c_code=C24&num=74>
7. <https://math-physics-problems.fandom.com/wiki/Mathematical_Puzzles_from_the_Gusuryak>


# 排除

Crosshatching

**排除**（Crosshatching），也叫**排除法**，是数独里最常见的一种技巧。按照游戏具备的行、列、宫三大要素，排除也会分为这样三个类型。

> 排除早期也被称为**摒（bìng）除**，一般认为是台湾地区引入数独的时候传入大陆的说法。后续还有一些技巧也会沿用台湾的叫法称呼，到时候也会说明一下。

## 宫排除（Crosshatching in Block） <a href="#crosshatching-in-block" id="crosshatching-in-block"></a>

我们把顺序调整一下，先来说说**宫排除**（Crosshatching in Block）。

<figure><img src="/files/5bPpqUbx7lQvYYPmRVL0" alt="" width="375"><figcaption><p>宫排除</p></figcaption></figure>

如图所示，我们把目光聚焦到第 7 宫里。

> 哦对，第 7 宫是左下角这个宫。宫的编号按照从左到右、从上到下的次序依次编号。最上层的三个宫分别为第 1、2、3 宫，中间层的为第 4、5、6 宫，而最下层的则是第 7、8、9 宫。左下角编号是 7，所以就叫第 7 宫。
>
> 另外，按照本教程的“尿性”，我们后续会一直使用 RCB 表达。因为 `r` 表示行，`c` 表示列，而 `b` 表示宫，因此 `b7` 可直接用于表示第 7 宫。后续我们也会使用这种方式来描述一些行、列、宫的具体编号。

我们需要遵守的数独规则里，其中一点是要求每一个行、列、宫都要有完整的一套 1 - 9。遵循这个规则我们深思一下。一个行、列、宫都有恰好 9 个格子，而完整的一套数字 1 - 9 又刚好是 9 种不同的数。那么我们安排每一个数出现一个放进去的话，就刚好用完了全部的 9 个单元格。因此，一旦中间出现重复的数字，那么那个重复的数字就会占用两个单元格及以上的名额，导致余下的 8 种数字无法再合理地安排进去了。换言之，必然会有一个数字最后无法填入其中，即保证不了完整一套 1 - 9 了。所以，完整的一套 1 - 9 暗含了一个意思：所有的数字不允许出现重复项。

按照这个说法，显然 `b7` 也不例外。我们发现，由于 `r2c1` 和 `r8c9` 都是 1 后，他们各自的所在行和列上都不允许再出现第二个 1 了，否则就违反了“不允许有重复项”的规则。正是因为此规则，图中打叉的位置都不能是 1。而纵观整个 `b7`，就只剩下唯一一处可以填 1 的位置。因为 `b7` 没有 1，那么 1 必须出现在其中，因此我们只能把 1 安排在唯一的那一处位置上。因此我们就得到了 `r9c3 = 1`。

由于这个技巧的推理结论下在 `b7` 之中，所以我们把这个推理过程（我们所谓的“技巧”）称为宫排除，即通过排除得到宫内结论的一种手段。

## 行排除（Crosshatching in Row） <a href="#crosshatching-in-row" id="crosshatching-in-row"></a>

<figure><img src="/files/T6IDMAD1LcTbAZRrf3bp" alt="" width="375"><figcaption><p>行排除</p></figcaption></figure>

如图所示，图中除了黑色的提示数外，我们还可以通过才学到的宫排除完整一些蓝色位置的填数。我们把这些蓝色的数字称为**填入数**（Modifiable）。填入数有些时候也可以参与推理过程，并不是说填上之后就放在那里“吃灰”了。当然，填入数最后会因为我们的推理顺畅而变得越来越多，因此部分填入数确实不一定会发挥它的推理的作用，所以这取决于你自己的灵活变通了。

> 在早期的教程里，填入数还被称为**确定值**。不过本教程暂时弃用这种说法，因为不够直观。

此时我们观察第 3 行（也就是 `r3`）。我们可以明显观察到，第 3 行需要满足一套完整的 1 - 9 的话，只缺少 5 和 9 尚未填入了。

而只关注于 5 的话，我们可以明显发现，`r9c2` 是 5。因为同列不能填入重复的 5，因此身处同一列的 `r3c2` 自然就不能是 5 了。那么，由于 `r3` 必须拥有一个 5 的填入，因此填入 5 的机会只能给到 `r3c8`。因此，图中的结论就是 `r3c8 = 5`。

我们把这个技巧称为**行排除**（Crosshatching in Row），因为他的填数位置是在 `r3` 之中的。

## 列排除（Crosshatching in Column） <a href="#crosshatching-in-column" id="crosshatching-in-column"></a>

下面我们来说说最后一种类型的排除。

<figure><img src="/files/gcL9dm3qKDq4WAaoDQvp" alt="" width="375"><figcaption></figcaption></figure>

如图所示，这一次我们把目光聚焦到第 8 列（即 `c8`）。

我们发现，数字 7 没有出现在 `c8` 里，因此 7 必须填进去一个。随后我们发现，`r1c2` 已经是 7，所以同一行不能填入 7，所以与之同一行的 `r1c8` 自然就不能是 7 了。不过，还剩下三处打叉的位置，这又是怎么排除的呢？

其实这里我们只需要一个数就可以参与排除了。注意到 `r4c7`。由于数独规则里，同一个行、列、宫里都不能有重复的数字。我们前面用到的只有行和列，这里我们要用到的是宫的排除因素。因为同一个宫也不允许有重复的数字，因此 7 出现在 `b6` 之中，也就意味着 `b6` 的别处都不能填入 7。所以，三处打叉的位置都和这个单元格同宫，因此他们都不能是 7。

这么一说，这个 7 的位置就比较明了了。`c8` 里此时仅剩下唯一一处填入 7 的位置：`r2c8`。因此，它必须是 7。

我们把这个技巧称为**列排除**（Crosshatching in Column），因为结论下在 `c8`。

> 另外，行排除和列排除在不那么需要强调行还是列的时候，也可以合并称为**行列排除**（Crosshatching in Line）。

## 问题答疑 <a href="#q-and-a" id="q-and-a"></a>

下面列举一些常见的、关于排除技巧的问题。这可能对你初学排除技巧有所帮助。

### 问题 1：在找行列排除时，宫内别处似乎也可以填它，为啥不能是它填？ <a href="#question-1" id="question-1"></a>

为了更加详细地解释这个问题，我们使用前面行排除的题目给大家解释一下问题问的是什么。这个问题也是经常有朋友询问我的一个问题。

<figure><img src="/files/T6IDMAD1LcTbAZRrf3bp" alt="" width="375"><figcaption><p>还是那个行排除</p></figcaption></figure>

如图所示。这就是刚才的那个行排除的题。有些朋友会问，我们使用了行排除的推演逻辑，用到的是下方 `r9c2` 处的 5。这个 5 虽然可以得到 `r3c8 = 5` 的推演结论，但是凭什么 `r1c8` 就不能是 5 了呢？

我个人觉得，问出这种问题的朋友具有发散的思维，这是好事。但这里我们并未对 `r1c8` 是否是 5 作出任何的推断。相反，数独的三大约束条件：行、列、宫的重要性是等同的。我们知道宫的逻辑后，就很容易思维转不过来，而在看行列排除时，误用或错用宫的逻辑去思考它，导致推断逻辑的混淆。显然，这里 `r1c8` 是否是 5 并不重要。我们观察的点始终都在 `r3` 上。

而从另一个角度来说，有些朋友更希望使用反证法的思维去推演矛盾，进而得到假设错误的思路。套用在这里也是可行的。比如我们反过来思考这个地方。如果我们让 `r1c8 = 5`，那么因为 `r3c8` 和 `r1c8` 同宫（也可以理解为同列），因此 `r3c8` 就不能填 5 了。而它不能是 5，同行还剩下唯一一处空格 `r3c2` 也会被最下面 `r9c2` 的 5 给排除掉，这导致了一个问题：`r3` 将不存在任何空格填 5。而它必须填有一个 5 以满足一套完整 1 - 9 的规则。所以这不就矛盾了嘛。因为假设的是 `r1c8 = 5`，所以假设不成立，故 `r1c8` 它不能是 5。

这种理解也没毛病，但这稍微绕了一些。我仍然推荐用正向的思路去理解这个问题。

总之，数独是一个严格的推理游戏，一旦有一个环节有错误的推断，那么后面必然就会产生矛盾。

### 问题 2：为什么不惜打乱顺序，先讲宫排除？ <a href="#question-2" id="question-2"></a>

这个问题其实存在一个非常具有说服力的原因：因为宫的观察更简单。

虽然宫是数独所独有的一种概念（你想想看，别的表格类型的谜题玩法是不是一般都只有行和列两种要素），所以相对于其他谜题玩法来说，数独的宫的因素更为陌生。初学肯定是比较难受的。但是，它的外观是 3 × 3 的正方形形态。不论放在盘面的哪一个位置（左上角也好、右下角也好，中间也好，两边也好），似乎这个正方形的形状都不会因为放的位置而变化。

这个的好处在于，它更容易被我们的人眼所聚焦。所有的 9 个单元格分布在比较紧凑的一坨里，这反而让我们觉得宫的聚焦更加容易。剩下的就是数空格的填数缺少什么，以及走外面找“外援”（排除项）了。然后我们再反过来看行列排除。行列排除最致命的问题是，它是 1 × 9 或 9 × 1 的长条形状。但凡盘面稍微大一些（物理层面的大——像素点更多、图片更大之类的），我们的人眼就必须尝试去从上往下、从左往右扫描一遍完整的 9 个格子，才能得到缺少的数字。

而缺少的数字有些时候会比较难以得到。因为数数稍微慢一些的朋友会觉得，缺少的数字需要我们大脑里临时记一下，而本身长条形状的 9 个单元格会让我们做起题来潜移默化增大了难度——又要临时记忆，又要横纵大幅度扫描。这便是行列排除比较致命的问题。所以，它的推理逻辑都不难，难的点仅在于观察上。

我在建议你做题的时候，也使用先宫排除，后行列排除的方式来完成。在迫不得已的时候（例如题确实没有宫排除的可用结论，或实在是找不着宫排除的时候），再来找行列排除；灵活变动你的推理思维，这是最重要的。

### 问题 3：做题的方式？ <a href="#question-3" id="question-3"></a>

这是第一个讲解的数独技巧，因此需要给大家介绍一下，做题的一些方式和套路，以便在你不熟悉数独的时候也有一个下手的切入点。

数独虽然看起来难，它满篇都是数字，但它的题目在平时我们不论在 app 上，还是网上找到的打印的题目，都并不难。从最入门的技巧开始，排除都是我们的必经之路，因此，排除肯定是最常见的数独技巧，这样的题目也肯定占比更多。

这并不是说数独没有难题。但数独现阶段作入门来讲，排除肯定是最基础的技巧，所以不论难度怎么划分，只要是入门级的题，就势必可以只用排除技巧完成。我们不要拘泥于某个达成的目标，比如做题的耗时什么的。先从 0 到 1，再尝试从 1 到 10，再从 10 到 100。这个循序渐进的过程是必须有的。初学数独的时候，哪怕只用宫排除的题目，做 20 分钟甚至更多时间的朋友大有人在，而如果你一旦熟悉了这个技巧，那么提速就会非常快，甚至进入 10 分钟、5 分钟，甚至 3 分钟以内。我们一定要有耐心。

这是第一个要说的。第二个要说的是，我们怎么去找切入点。我拿一个例子给大家介绍一下，我是怎么做题目的。

<figure><img src="/files/yRaMdEwr18vgwv0TSDqx" alt="" width="375"><figcaption><p>一个宫排除的题目</p></figcaption></figure>

如图所示。我们要想完成它，就需要找一个切入点。我们刚才学到的排除，不论是宫还是行列排除，全都是只跟单一的数字有关的技巧。那么我们尝试按数字，将提示数分为 9 种不同的阶段来逐一完成；如果发现某一个数无论如何也完整完成不了，也别灰心，可能题就是这么设计的，那么跳到下一个数继续做就行了。

举个例子。这个题目我们先从数字 1 切入，看看 1 的分布都有哪些位置。很明显我们发现到，第 3、6、7 宫还没有填 1。刚才我们说我们优先找宫排除，所以我们就按第 3、6、7 宫的次序逐一击破即可。

> RCB 表达可以简写。例如第 3 宫、第 6 宫和第 7 宫可以直接把数字拼在一起，简写为 `b367`。这个用法后续可能会用到，到时候也会反复强调，直到我觉得你记住了它为止。

先看 `b3`。我们发现似乎 `b3` 并没有合适的、关于数字 1 的结论，因为似乎 `r1c7` 和 `r1c9` 都可以填 1，那我们就跳过它，来看 `b6`。`b6` 可以填 1 的位置只有 `r4c9`。这很明显。

<figure><img src="/files/bLSEk7Hjg5B6cHABQhWw" alt="" width="375"><figcaption><p>b6 填 1 的位置</p></figcaption></figure>

同理，`b7` 也存在可以填 1 的位置，将其填入。

<figure><img src="/files/v1mF0PCEAR5EMsTxPAwY" alt="" width="375"><figcaption><p>b7 填 1 的位置</p></figcaption></figure>

所以我们连续填出两个 1 的位置。由于 `b6` 填了 1，所以整个盘面里还剩下唯一一处 1 的位置，把他填上即可。

<figure><img src="/files/5V8P785KN0PwmJdQlfPX" alt="" width="375"><figcaption><p>1 全部填完</p></figcaption></figure>

这样一来，所有的数字 1 全部被我们击破。此时，盘面还剩下 8 种数字没有填了，我们继续填 2 即可。后面的数字就不再演示了。这个题的难度也不大，可以自己从头做一下。


# 唯一余数

Naked Single

下面来讲下另外一个技巧。这个技巧观察上稍微会比排除难一些，不过它不存在所谓的多种类型，就只有一种，因为它会同时混用行、列、宫其中至少两种因素来作推断。

## 例子 1 <a href="#example-1" id="example-1"></a>

<figure><img src="/files/olqi0aIjnCFqxOQk5DcQ" alt="" width="375"><figcaption><p>例子 1</p></figcaption></figure>

如图所示。这一次我们思考逻辑从找缺少的数字改成聚焦到单元格本身上。

我们现在只看 `r6c1` 这一个单元格。由于宫内的数字特别多，所以我们就直接只看宫内来确定可选项。和 `r6c1` 同宫的出现数字有 1、2、4、5、7、9 一共六种，所以还剩下 3、6、8 尚未填入，因此，`r6c1` 可以填的还剩下 3、6、8。

而这个时候，我们稍微运用下外面的数字就可以发现，因为 `r1c1` 是 6，而刚好和 `r6c1` 同列，因此 `r6c1` 就不能填 6 了；同理，由于 `r6c8` 是 8 恰好跟 `r6c1` 同行，因此 `r6c1` 也不能是 8。这样，我们又排除了 6 和 8 两个填数情况。所以，`r6c1` 此时仅剩下 3 是唯一一个可以填的数字。

由于这个单元格本身必须得填一个数进去，而 3 刚好就是唯一的填数可能，所以 3 它必须是对的数字，所以 `r6c1 = 3` 是本题的结论。

我们把这个技巧称为**唯一余数**（Naked Single），有时候也简称**唯余**或**喂鱼**（谐音）。可以看到，它和排除非常不同的是，排除只依赖一种数字，而唯一余数需要用到全部 9 种数字，其中 8 种是用来排除可能项的，而剩下的 1 种是作为结论存在；其次，它也不拘泥于某一个行、列、宫，而它会同时用到宫、行和列上的数字。所以它的难度会比行列排除在观察上还难一些。

不过，我们可以使用前面介绍的方式来找这个技巧：先找出行、列、宫里出现数字更多的一边，然后确定余下的可能性后，再去外面找别的数作补充，进而得到结论。

## 例子 2 <a href="#example-2" id="example-2"></a>

我们再来看一则例子。这个例子观察上比刚才那一个要难一些。

<figure><img src="/files/zyFXeKS4b4cLZDgNOnE3" alt="" width="375"><figcaption><p>例子 2</p></figcaption></figure>

这个例子我们就不能再看宫了。这一次我们要看行。

观察 `r7`，我们可以看到数字出现得非常多。因为有 2、4、5、7、8、9，因此还缺少的只有 1、3、6 了。随即我们再去看 `r7c9` 的所在列和宫里。正好，`c9` 里还真有 1 和 3 的出现，所以 `r7c9 = 6` 就可以轻松得到了。

## 例子 3 <a href="#example-3" id="example-3"></a>

下面我们再来看一个题，不过这个题就留给你自己思考了。

<figure><img src="/files/G4tnFW5jeImBzFugXS2q" alt="" width="375"><figcaption><p>例子 3</p></figcaption></figure>

## 唯一余数的观察 <a href="#spotting-of-naked-single" id="spotting-of-naked-single"></a>

这是一个需要熟能生巧的技巧。我们需要优先聚焦于一些空格较少的行、列、宫，在确保“空格的数字有哪一些”可以快速得出时，然后再去外面找别的数字作为排除项，并最终定位出结果。

这个说法说实话，说简单也简单，说难也难。我推荐各位平时就尝试练习一下对数字 1 到 9 的敏感度。我这里有一个网站推荐给各位练习。

<http://www.sudokufans.org.cn/tools/finder.php>

这个网站可以用来练习你的“数感”。该网站可以提供一个简易的机制，通过同行、列、宫的 8 个格子的填数，让你回答剩下的唯一的这个数是多少。不过，像是上面的唯一余数的类型，这个网站暂时是不支持的。

这个网站提供数据记录和计算，帮助你在练习完成之后，可以明确告知你的完成的情况：正确率，完成题目数量，完成一道题的平均用时等等重要信息。

我在这里给一个参考数值。如果你要想提高你对数字的感知能力的话，我建议你必须对于这种题型来说，平均一题的耗时要控制在 2 秒之内，最好能进入 1.2 秒。可能你觉得比较困难，但是努把力是可以达到的，希望你能坚持下来。

直观技巧就这两个：排除和唯一余数。下一节将进入到局部标记技巧的板块里来。


# 做题策略・基础概念

Strategying Phase Ⅰ

在完成题目的时候，我们经常会遇到无法下手的局面，这并非是你的问题，所以我打算对教程单独开一个板块讲解这一部分的内容，以便你能够快速上手的同时有一个对数独的比较合理的认知。

当然，主观的内容每个人都不同，所以不一定适用于你，但你可以用来当参考。


# 数字锁定策略

Digit-Locking Strategy

当你看到密密麻麻的数字而无从下手时，你肯定会寻找一个固定的做题策略来帮助你完成题目的同时，又可以有一个比较方便快捷、以便随时可用的办法。

在数独里，它并非不存在。这便是今天要为各位讲解的做题策略：**数字锁定策略**，也叫**锁定数字策略**（Digit-Locking Strategy）。

## 学会只看单一数字 <a href="#learn-to-spot-positions-for-only-single-digit" id="learn-to-spot-positions-for-only-single-digit"></a>

初学的时候，我往往会教各位只将眼睛盯着其中一个数字去看。这到底是个什么含义呢？

<figure><img src="/files/ShlmVPZ7dHo7KgMk99JV" alt="" width="375"><figcaption><p>一个题目</p></figcaption></figure>

如图所示。当你拿到一个题的时候，你知道排除和唯一余数两个解题技巧可以使用。其中，排除只跟一个数有关；而唯一余数，则只跟一个单元格有关。

显然，找排除可比找唯一余数要轻松多了。排除只需要看其中一个数字就行了，而别的数字全都是用来给这个数的余下可填位置作排除项的。而唯一余数恰恰不行，因为它直接就要求我们找完全部 1-9 并全部数一次，确保只有唯一的一个数字填入才是正确的结论。

按照做题时间的长短，显然排除比唯一余数的效果更出众。那么我们不妨让大家入门就从排除起手。而且，在讲解技巧推理过程的时候我就说到过，三种排除里，宫排除最简单，因为它下结论是看的一个宫的空格情况；而这个宫里剩余的可选位置是我们最容易一眼看全的，而行和列都不行——行和列的形状是长条形的，天生就比宫要难看一些。

那么，确定了我们要使用的技巧之后，我们下一步就得开始看格子。鉴于宫排除是排除的一种；而排除又是只跟单一的数字有关系的技巧，那么我们不妨只看全盘里所有相同数字的分布情况。比如数字 1，我们明显发现这个题里每一个宫里都有 1。按照数独规则，我们要填满全部空格，且数字 1-9 每一个数字都要在行列宫里都出现 1 次，那么它的总情况显然是每一个数都要填 9 次。而很显然这个题数字 1 已经有 9 个，所以这说明我们需要完成的数字只有 2-9 这 8 个。

接着，我们如果是无头苍蝇的话，可以按次序来。比如我们就真的先去看数字 2。显然这个题里 2 出现还比较多。按数独规则算，每一个宫都必须填一次 2，所以我们就去找哪些宫没有 2。显然，这个题的第 3、5、7、8、9 宫没有数字 2 的出现，这也就意味着数字 2 还得填 5 个进去。

> 初学数独的时候会有一个对数独规则比较迷惑的点。为什么数的是宫而不是行或列？直接从推理角度去思考，数独只有 81 个格子，而每一个格子要安排互相行列宫都不重复的 1-9，所以每一个数必须均衡出现才能保证其数量是合适的。而均衡出现的结果就是每一个数都出现 9 次。但在计算的时候，不论你是横着看（按行看）、竖着看（按列看）还是按宫看，每一个数都会被重复计算一共 3 次，所以并非是 27 次数字 1-9，而实际上只会出现 9 个 1-9，因为每一个数行里面算一次，列里面算一次，宫里面又会被算一次，所以被算了三回。
>
> 既然数独里 1-9 每一个数实际就只能填 9 个，那其实按行看还是列看还是宫看其实就是无所谓的了。毕竟，除了技巧使用上不同以外，单纯从数位置的角度而言谈起的话，肯定是等价的。那么，我们肯定会选更好看的去看，所以我才告诉大家去看宫，而不是行和列。所以，“1-9 宫每一个宫都出现一次数字 2”的这个说法其实是想告诉你“数字 2 必须出现 9 次，而且每一个宫都出现一次”的这两点信息。

那么我们直接去挨个看就行。顺着数过去，显然第一个要看的是第 3 个宫。它能填出来 8 的实际位置吗？是的：

<figure><img src="/files/PvWNeq1T2LTC2MGsG9pI" alt="" width="375"><figcaption><p>第一个宫排除，出第 3 宫的 2</p></figcaption></figure>

如图所示。这样第 3 个宫就被我们找到了。接下来去看 5 宫。很不巧，5 宫出不了数。所以我们只能继续第 7 个宫。

还是不巧。空格剩得太多了，外侧数字 2 能影响的范围虽然很大，但仍然会余下两个位置可放。此时我们不确定 2 究竟填哪个，所以只能放弃，继续看后面的第 8 宫和第 9 宫。

> 这里要说一个初学数独又一个困惑的点：我们此时已经就剩下两个可填位置了，为什么我不猜一个？万一对了呢？
>
> 这并非是有意批评提问的朋友，但这确实需要好好跟各位谈一下关于做题目的的问题。我们要完成题目这显然是一个比较重要的目的，但我们忽略了比完成题目更重要的东西：思维。不论你玩数独是出于哪种初衷（打发时间也好、为了让自己对数字的敏感性提高也好、甚至是工作需要也好），数独贯穿始终的其实是它带来的对你逻辑推理能力的冲击和挑战。可能有些后面的技巧难度会很高，可能你找不到他们，可能你因此做不出一道题，但这都不重要。
>
> 你的目的是锻炼你的思维能力。时间的长短并不重要。初学的朋友很容易会陷入一种思维惯性：我做着做着就会让自己去猜一个，毕竟我填不下去了。填不下去真的不是问题，很多初学的朋友遇到的第一道数独题经常会做半个小时，这是正常的现象。
>
> 我见过太多“浮躁”的玩家了。数独的脑力体操小游戏给你带来的是让你静下心来好好欣赏题目让你对数字的认知和敏感程度的提升，所以它必须要静下心来做。半个小时确实很长，它甚至都快赶得上一节课了。但是，这只是因为你对数独的认识还不够熟悉导致的。如果你真正理解初学数独游玩的题目难度和你的能力潜力是匹配的的话，那么剩下的就只是多做几个题而已。
>
> 数独的提速非常快，比你想象得还要快。如果你狠下心完成了一道和你能力匹配的题（比如你刚学会宫排除，你就去练手找一道宫排除作为题目主要技巧的题去做），那么它显然会给你带来的是你的满足感，因为你把它做出来了，而且不需要任何的帮助和外界提示。这份成就感只有你自己亲身体验过你才会知道。而你做完一个题，你肯定会知道你这一局游玩体验里大概在哪里会卡壳，大概哪里会有提速的空间。所以你的第二题如果是同等难度的话，你甚至可以从 30 分钟的做题时间直接缩短到 10-20 分钟。这个提速是非常显著的。但是真要看你做的这两道题，你自己的宫排除的熟练度其实并没有特别大的提升，毕竟一个题能带给你的提升是非常有限的。但是，时间上而言，你确实只需要一个题就能从 30 分钟变为 20 分钟以内。
>
> 我知道，一天玩一道题 30 分钟，第二题再玩 20 分钟这就小一个小时了。但是，你并不需要一天做很多题，两个题就够。初学对自己要求也不必过于严格。
>
> 所以，回到最开始的问题。我并不建议各位直接做不出来就猜。原因其实很简单：因为你是初学者，你的基础功必须要扎实。猜确实可能会让你更快完成题目，但这对你的推理能力没有任何帮助。毕竟，谁都会猜，它没有一个明确的、规范的、成体系的思维体系，只是简单地填入一个数然后去看是否有矛盾。

那么我们继续看第 8 宫。很遗憾，第 8 宫也没有。接下来就只有第 9 宫了。很好，第 9 宫确实有。

<figure><img src="/files/xjXZYLie2FztwJhiRCBk" alt="" width="375"><figcaption><p>第 9 宫出 2</p></figcaption></figure>

太不容易了。这样我们就看完了一遍全部的 2。

接下来，一般会有两种做法：直接看数字 3，和继续死磕数字 2 直到确实没有可填的情况了。如果是我的话，我会继续看 2。因为此时 2 已经填了两个，这两个 2 也可以用于找数字 2 上面。这就是宫排除，一个利用同一种数字解题的技巧。

接着看 2 的话，我们发现 2 确实还能继续填。刚才我们不是说第 7 个宫没办法填是因为余下了两处单元格 `r7c1` 和 `r9c1` 吗？那么我们这个时候 2 已经填到了 `r9c9` 上，这说明第 9 行整个行的别处都不能第二个填 2 了。这不就用上了！`r9c1` 刚好也在第 9 行上，所以它此时就不能填 2 了，于是第 7 宫的 2 就可以继续得到了。

<figure><img src="/files/hqcFRvES2TwVZU3hp2CG" alt="" width="375"><figcaption><p>第 7 宫出 2</p></figcaption></figure>

接着，我们第 8 个宫就可以填 2 了。

<figure><img src="/files/4Zv9W87IGEkvzRhdBcyk" alt="" width="375"><figcaption><p>第 8 宫出 2</p></figcaption></figure>

接着，第 5 个宫是最后一个剩下的、没填 2 的宫了。既然 8 个宫都有 2 了，最后一个 2 肯定是必然可以填的。所以我们把它填上。

<figure><img src="/files/DlNm9LoSb89hRqGSLs6k" alt="" width="375"><figcaption><p>第 5 宫出 2</p></figcaption></figure>

这样，所有数字 2 就全部填完了。

接着我们就可以看数字 3 和后面的其他数字了。

## 行列排除的策略 <a href="#strategy-on-chosing-crosshatching-in-line" id="strategy-on-chosing-crosshatching-in-line"></a>

前面这个题按宫排除甚至可以直接到这里：

<figure><img src="/files/J3Mz3k5MS4ZmT3Rd8PPM" alt="" width="375"><figcaption><p>可以直接到这里</p></figcaption></figure>

如图所示。下一步其实是要填 6 的。为什么？因为按照我前面说的这个数字逐个击破的思路，到这一个盘面状态下，刚好才填了数字 6，而 6 还没填完，所以继续填 6。不信你可以自己试试。

这个时候你会发现，这个题宫排除要想进行下去就必须切换到数字 7 了。数字 6 已经没位置填了。

> 或许你知道区块排除，不过我不打算先提及任何超纲内容，这个我们之后介绍了区块再说，这里就先卖个关子。

若是你非要填数字 6，数字 6 要出数是 OK 的，不过要用一个行排除：

<figure><img src="/files/pLHYnYSqfNMJhzbpilHl" alt="" width="375"><figcaption><p>用一个行排除可以出 6</p></figcaption></figure>

这勉强算一个题目的瓶颈。因为它确实会卡住不少的人，大多数初学者都找不到这个 6，虽然它就剩 3 个空，大不了挨个都看一下呗。但是，我刚刚说过，按宫排除做题的思路，很少会有人能进行灵活变通，即使你之前学过行列排除甚至唯一余数技巧，但自己也会下意识按惯性去做题，所以下一个还是宫排除，大不了先把别的宫排除都填了回来再看都行。毕竟，万一这里的行列排除会因为空格少了很多就变成宫排除了呢？

这是一个好的思路。而且我也会建议你这么做。如果你要对自己的熟练度有一个提升，你可能需要掌握的是对难度较高的技巧有一个认知上的权衡。如果你有充分的把握认为这个盘面里它就是会有行列排除或唯一余数，而且比较好看到，那你可以大大方方先用这些技巧来做题；但是如果你没有十足的把握，那你大可先去看别处的宫排除，毕竟它确实简单一些。

## 策略总结 <a href="#conclusion-to-this-strategy" id="conclusion-to-this-strategy"></a>

这个题一旦用了这个行排除后就不难了，后面没有任何行列排除和唯一余数了，最高难度宫排除，你可以练练手继续完成，也可以自己做一遍这个题，从原题最开始的地方开始做。

那么总结一下我想告诉大家的做题流程：

* 宫排除至上：先找宫排除，然后才是行列排除，然后是唯一余数；
* 适当灵活调整：如果你有一定的把握认为盘面下一步看行列排除或唯一余数更好看（比如盘面空格摆放确实更容易出行列排除或唯一余数）的话，那么你可以试试去找他们；如果没有把握就继续看宫排除；
* 数字锁定策略：按照数字 1-9 次序逐个去解题，先看数字 1，把数字 1 填到自己实在是看不到下一个位置在哪里了为止，然后继续数字 2、数字 3、数字 4，以此类推；
* 必要的轮回：当你完成了一轮的数字 1-9 发现题能做完那就皆大欢喜；如果没有的话就继续从 1 开始看。当然，如果你有把握发现别的数字也有填的，那你可以适当先去填别的数字；当你认为自己还是无头苍蝇的时候，就老老实实按数字次序逐个击破就好。

## 一刀流的概念 <a href="#concept-of-ittoryu" id="concept-of-ittoryu"></a>

前文我们教大家按数字次序去做题。在数独里，我们还真有一个术语描述一类跟这种做题模式相关的题目。

如果有一个题它能在你一轮数字 1-9 逐个看完的时候刚好把题给做完，那么这个题我们就称为它是**一刀流题**（Ittoryu Puzzle）。所谓**一刀流**（Ittoryu），指的是你在做题的时候按一轮数字 1-9 完成的这个过程；对应地，如果你要两轮才能完成，就可以叫“二刀流”，甚至是更多的“三刀流”，等等。

显然，如果练手的话，我会推荐各位去做一刀流题，主要就是为了让各位练习熟练度。显然，这种题也是很少的，大多数数字摆放都不允许你做的题能一刀流；但是一刀流确实可以用来帮助你提升熟练度。


# 剩余数的概念

Concept of Lasting

在前面讲过的两种技巧[排除](/direct-technique/01-crosshatching)和[唯一余数](/direct-technique/02-naked-single)里，我们用到了排除项得到结论的推理套路。为了更方便描述一些后续的东西，我想安排一个额外的文章篇目给各位介绍一下**剩余数**（Lasting，简称**余数**）的概念。

> 本文主要是为了讲解题目的难度衡量，所以不讲技巧。它说起来也确实有些晦涩，如果你不想看也可以跳过它。不过，它对你认知题目的难度，以及一些额外定义上来说会有帮助。

## 剩余数的定义 <a href="#definition-of-lasting" id="definition-of-lasting"></a>

在**直观技巧**（Direct Technique）的范畴里，剩余数指的是填入目标结论（某个格子填某个数字）之前，在目标**区域**（House 或 Region）下剩余的空格数量。

先来解释一下这两个概念：

* 直观技巧：指的是排除、唯一余数这种直接可以得到填数结论的技巧类型。数独技巧里，狭义上只有这两种技巧是直观技巧，而其他的都是非直观技巧；
* 区域：行、列、宫的统称。就和行列排除一样，当你不需要非得强调行还是列还是宫的时候，直接用区域一词来表示就行。

既然说明白了这两个概念，那么剩余数的概念就很清晰了。我们来看一个例子。

<figure><img src="/files/xIvlT8WHHzW7OJh8dPyx" alt="" width="375"><figcaption><p>行排除，行余 2</p></figcaption></figure>

这个例子里，我们可得到行排除结论是填入 6 在 `r9`。目标区域就是 `r9`，而里面只有两个空格，因此 `r9` 剩余数为 2，或者直接简单叫它**行余二**。这个说法是不是听起来蛮“古色古香”的？

我们再来看一个例子。

<figure><img src="/files/IIaALW3hKD63y7WOcRbu" alt="" width="375"><figcaption><p>列排除，列余 3</p></figcaption></figure>

这个的结论在 `c9`，空格数量为 3，所以称为**列余三**。

排除很好定义余数的概念，但是唯一余数似乎不太容易。对于唯一余数而言，我们选取的是，按照前面介绍的观察方式（选取空格剩余少的区域，在数出剩余的可选项后，再在外面找可排除的项），对那个排除项更多、空格数量更少的区域作为目标区域。

<figure><img src="/files/2ZfvB4pBTmjSqvLbEtUg" alt="" width="375"><figcaption><p>唯一余数，宫余 3</p></figcaption></figure>

比如这个例子里，目标单元格（结论单元格，即 `r9c7`）所在的行上有 3 个空格，列上有 7 个空格，宫内有 3 个空格。而因为宫的观察方式优于行和列，因此我们把这个唯一余数定义为**宫余三**。

总而言之，直观技巧的剩余数定义规则如下：

* 排除
  * 宫排除：直接看目标的宫剩下几个空格，就叫**宫余几**；
  * 行排除：直接看目标的行剩下几个空格，就叫**行余几**；
  * 列排除：直接看目标的列剩下几个空格，就叫**列余几**。
* 唯一余数
  * 按区域分类，确定目标单元格所在的这个区域剩下多少空格，找出最少的那一个区域，并取名**什么区域余几**；
  * 如果行列宫里至少有两种区域剩余的空格数量一致，就按宫、行、列的先后优先级次序取名。如既可以叫宫余几和列余几的，规定先宫后列的方式，叫宫余几。

## 只依赖单一剩余数的技巧 <a href="#unique-lasting" id="unique-lasting"></a>

为了让我们使用技巧的列表更加饱满，剩余数只有 1 的两种技巧还有单独的名字，我打算放这里说。

### 单元唯一（Full House） <a href="#full-house" id="full-house"></a>

**单元唯一**（Full House），有时候也直接用它的英文名 Full House，指的是某个行、列、宫里仅剩下唯一一个空格的技巧。是的，它其实就是剩余数为 1 的特殊情况。

我们来看一个例子。

<figure><img src="/files/zH22MdoplbQikZ62guV6" alt="" width="375"><figcaption><p>单元唯一</p></figcaption></figure>

显然，在 `b8` 里，只有 8 没有填。直接填入 `r8c5 = 8` 便是这个技巧的结论。

### 数字唯一（Last Digit） <a href="#last-digit" id="last-digit"></a>

和单元唯一的用法相反，**数字唯一**（Last Digit）是同一个数字，在全盘里只剩唯一一处没填的特殊技巧用法。

<figure><img src="/files/Kghpo74CCC8majmgraUp" alt="" width="375"><figcaption><p>数字唯一</p></figcaption></figure>

比如这个题里，7 全盘只有一个没填了。赶紧填进去，就是这个技巧的结论。

可以看到，数字唯一其实就是特殊情况下的宫排除。不论宫内空格剩几个（余数是多少），难度始终是一致的：因为直接看哪些宫没有这个数就行了。一旦只有一个宫没有填这个数了之后，那么这个数必然可以在这一步里得到。

至此，直观技巧就介绍完毕了。下面我们需要进入到区块和数组的学习之中。

## 题目难度挡位的划分 <a href="#difficulty-rating" id="difficulty-rating"></a>

剩余数不可能仅仅以定义形式存在，不然光有个定义发挥不出作用，定义它干嘛。剩余数的定义，本质是为了衡量一个题目的难度。为了让玩家可以更轻松地知道题目循序渐进的过程，剩余数的定义和观察难度耦合。换言之，一个题目的难易程度更多体现在玩家是否找得到这些技巧，而不是题本身推理的难度大不大。这才俩技巧，能有多难的思维。

可以从前面列表的定义里了解到，它其实跟观察难度有不可拆分的关系。尤其是唯一余数，确定行列宫具体是哪一个区域类型，甚至用上了宫观察更容易这一点。这便是我想说的。

如果一个题只有宫排除的话，那么这个题就算宫内空格剩余足够多，那么它都不一定非常难；但是一旦牵扯到行列排除和唯一余数后，这个题目的难度有一些难以捉摸了。首先，技巧的推理的不同导致技巧本身就具有难度差异；其次，余数的多少也会影响到题目的难度。

以我个人的意见，我更倾向于这么安排一个题目的难度：

1. 如果一个题只有宫排除难度（不超过宫排除的技巧就可以完成题目），那么只分两种情况：
   1. 如果宫排除只会用到外围 1 到 2 个排除项就可以得到目标结论，则它是第一挡位（最简单）的难度；
   2. 如果宫排除用到外围 3 个或 4 个排除项才能得到结论，则它是第二挡位（稍微难一点）的难度。
2. 如果一个题需要用到行列排除和唯一余数，则统统都归为第三挡位。还要细分的话，就按下面这样的规则细分：
   1. 按照余数数量从少到多的次序去题目里找目标结论；
   2. 如果做到某个位置下，同时存在多个余数一致，但技巧不一致的情况，则按技巧的推理难度，先用行排除，然后用列排除，最后才是唯一余数的次序去使用他们。

按照前面描述的逻辑，每一步稳扎稳打地记录下每一步用到的技巧，最后列出它们。整个技巧列表里，找出难度最大的那个，就是这个题的难度。

我举个例子。

<figure><img src="/files/ZjrNHbrTdF0HvSuIamMM" alt="" width="375"><figcaption><p>一个例子</p></figcaption></figure>

这个题要完成它，会用到除了宫排除外的直观技巧。按余数排列出来，会用到这些：

* 宫排除；
* 行排除：行余二、行余四；
* 列排除：列余二；
* 唯一余数：行余三。

显然，余四的行排除空格数量要求最多，所以我们把这个余四的行排除作为这个题目的最大难度的技巧使用步骤。我们也可称它为**卡（kǎ）点**（Bottleneck）。它在这个题的这个位置：

<figure><img src="/files/I1D4FzkARB7vDjpJZYkZ" alt="" width="375"><figcaption><p>行排除，行余 4</p></figcaption></figure>

如图所示。这是这个题目的卡点。

可以从这个卡点规则了解到，这个题目的难度严格按照余数来规定；而一个题的卡点也不一定非得只有一个。如果一个题同时用到两次最高难度的技巧（余数最大，技巧难度最高），则它们都可以算作卡点。

卡点的多少，从另外一个角度也衡量了题目的难度。就好像你做两个题，10 个卡点的题和 1 个卡点的题，都是一样的最高难度技巧，那显然 10 个卡点的那个题做起来会更难一些。


# 错题

Mistakes

做题难免出现错题的情况。当你遇到做题做错的时候，我们有什么解决办法呢？

## 回溯策略 <a href="#backtracking-strategy" id="backtracking-strategy"></a>

在你做题的时候，例如你用纸笔进行做题的时候，很多时候你在填错数字的当时是不会发现错误的。等你往后推了一部分之后，可能才发现到一个问题：无论如何填数，所在行、列、宫都无法正常满足 1-9 各一次的情况。这个时候你必须意识到一点：你已经做错了。

当然，这个时候可能是题本身有问题。但一般而言，我们通常会相信出题者，除非在纸上做的时候，题目印刷的时候错印、漏印等情况确实难以避免，这个问题说起来就太复杂了，所以我们尽量还是保持相信出题者，相信题目是正确的。那么，正确的题目遇到此情况的时候先不要慌。先想想你在什么时候错的。

有人会问，这不是不知道哪里错的吗？这怎么可能想得到？一般来说，是的。不过，你在做题的时候肯定会有一种思路和感觉。比如说，因为你自己对自己最了解，所以你肯定清楚你自己对排除和唯一余数技巧的掌握程度。如果我唯一余数差一点，那么我的数数就会格外小心。所以一般而言，唯一余数我都会数得比较慢，或是多数几次来降低我数错数字的几率。但如果唯一余数差点，那么我的排除就会好一些。此时我可能会对排除放松警惕。那么，在数格子余下的空位的时候，我们就可能会出现脑子故意或无意跳过一些空位的错误情况，造成填错位置。

这一点不仅在纸笔做题上出现，包括我自己在内，我在手机应用里玩数独也经常会填错位置。从自身的角度出发，你应该知道你自己在造成错误的盘面状态之前，有多少个步骤已经进行，其中那些能让你感觉上“模棱两可”的地方，需要反复回顾。如果你能知道具体的位置，那么可以回退到那个局面，把从那个盘面开始的后续所有填数全部去掉，作为恢复点继续完成；如果你不知道在哪里，也没有关系，大概位置你应该是有些许印象的。你可以试着回顾一下现在错误的局面，看看哪些位置是后面填上去的，大概确认一下原本的位置是什么，然后尝试去回溯它。

## 数字形状造成错误时可以补救 <a href="#rescue-of-wrong-filling-on-digit-shapes" id="rescue-of-wrong-filling-on-digit-shapes"></a>

数独是一个非常严谨的游戏，如果一旦有问题，抛开题目本身有问题的特殊原因以外，只能是自己的问题了。这个问题包括但不限于下面两种情况：

1. 排除和唯一余数技巧在数的时候数错了（数漏了）；
2. 因为数字的形状相似导致填错，例如 4 和 9 因为写法很相近，所以经常手写的时候写错，把 4 填成了 9 之类。

对于第二种而言，这种其实还好。这种情况更多会发生在你唯一余数等数数操作上，确定余下的数字的时候。这个时候如果因为数字的形状相似，然后脑子里想的填 9，结果写了个 4 的情况其实是比较普遍的。这个时候其实并不影响题目后续的发展，因为这种错误会造成的局面必然是同一个行、列、宫出现两次这个数。这个时候你只需要定位到某个单元格，它所在行、列、宫都出现两次同样的填数的时候，把它改回来就行了。

这便是这种特殊情况的补救措施。

但是对于第一种……

## 老老实实重新做吧 <a href="#play-this-puzzle-again" id="play-this-puzzle-again"></a>

确实如此。数独这个游戏确实不允许你错的时候还能修正为正确答案。除了前面提及的办法，多数时候你都是不知晓错误的根源的。既然知道根源，那肯定改起来就很快；但既然不知道，那是谁来了都不好使，这个题只能重新做。

我知道这很难受。但是这确实是必要的。你就当是在惩罚你自己对做题时忽视造成不严谨的错误，而设定的存在。就跟你老师发现你这么小的问题都能做错，然后让你罚抄差不多。好好重新做，体会一下为什么第一次做题做错了，理论上第二轮做题按照相同的做题策略应该做起来感觉会差不多的，因为之前我们提到按数字锁定策略进行做题的时候，显然它的规则已经大幅度限定了你的下一步，所以第二次做一般不会有太大的改变，这样可以帮助你回顾和发现第一次做错的地方。

## 不要强行改数字 <a href="#do-not-modify-digits-you-have-filled" id="do-not-modify-digits-you-have-filled"></a>

在错题的时候，请不要强行修改你之前填的所有数字，任何数字都不要碰。在回忆起错误或决定重做之前，任何数字都不要改。

这是因为你填入的数字不都是错的。你不知道哪里错了，就不要随意认为它是对的或错的，去假定它必须是这样的结果，而去改变它。这样可能会带来更糟糕的结果：越改越错。

不要想着从这个角度去补救。这不是合适的做法。

## 不要依赖应用程序的帮助和提示 <a href="#do-not-rely-on-hint-and-help-functions-on-application" id="do-not-rely-on-hint-and-help-functions-on-application"></a>

当你遇到了错误的填数，大多数时候，应用程序都会提示你填错。甚至，你在填了一个数之后，它就能立马知道你填对了还是错了，这个过程甚至都不需要它帮你推算一遍你用的技巧是否正确。

这个很重要。软件提供用户判断对错的思路并不是按逻辑去算一次，而是比对答案。这是最便捷的办法，也是最奇怪的办法，也是最迫不得已的办法。应用程序大多不支持实时推算用户的填数使用了什么技巧，因为这非常耗时。不过，有些应用会有这样的行为，但也只限于支持前面排除和唯一余数这样基础的技巧。到了后面，复杂的算法要想支持到用户填写数字的推算，根本就不现实，这个主要的矛盾点还是在于它太耗时间了。

所以，软件更多会临时算出题目的解。算解比起推算技巧而言要快很多。即使电脑在快速执行逐个数字试填去找矛盾的笨办法，最终得到题目的全部空格的全部正确的数字所耗的时间可能都比起算一个数独技巧要更快。当它拿到题目的答案后，它会判断你的填写是否和答案一样。如果答案不一样，多数时候软件会立马告诉你这个填数是错误的。

我知道，你此时可能会想：What？我填这里为什么错了？然后死活想不明白为啥填这里就有问题，我填这里没发现有矛盾啊，凭什么软件说我填错了，然后就开始陷入沉思。当你知道了前面的原因之后，似乎这个问题就迎刃而解了：因为它知道答案。它可以更快地拿到题目的答案然后和你的填数进行比对。因为你采用了错误的策略造成了填数错误，于是这个格子不是填这个数的，它自然就会告诉你是错的填数。

那么，从我们的角度出发，我这么填更多还是出于一种猜测的感觉在其中。当你发现有些时候行列排除确实看不见的时候，你可能会使用一下小猜的办法，就是随便填一个数，然后看看对不对。我不否定这样的玩家的做题习惯是否有问题，猜也确实是一种做题策略。但是，我们的目的并非是解出答案，而是享受推算逻辑推理给我们带来的脑力体操。你当然可以通过猜来更快得到题目的解，但光是一个解并不会带来什么实质性的帮助，除了众多 app 给你的一些奖励。光鲜亮丽的奖励背后是辛苦钻研和努力揣摩、做题的自己，你必须要静下心来享受它，否则数独它真的不好玩，你不如去玩点别的游戏，还不如玩点不费脑子的游戏。

你当然可以一个小时完成一道只有宫排除难度的题，打发时间是一个非常不错的选择，与此同时你也可以知道你对宫排除掌握是一个什么水平，然后不断提升自己。做题只会越来越快，第一次一个小时，第二次换一个题估计就只有二十分钟了，第三次甚至只有十几分钟甚至十分钟。好好享受它，希望它给你带来的思维风暴能让你越战越勇、勇往直前。


# 割补（LoL）

Law of Leftover

下面我们来学习新的技巧类型：**局部标记技巧**（Partial-Marking Technique），也简称为**局标技巧**。局标技巧指的是，在前面学到的技巧里已经无法直接得到结论的时候，就需要使用到辅助信息了。而这些信息无法直接得到结论，而是辅助排除和唯一余数技巧一起才能得到结论，属于是比排除和唯一余数更高一级的技巧类型。

这种局标技巧一共只有三个：

* **割补**（Law of Leftover，简称 LoL）
* **区块**（Locked Candidates，国外也简称 LC）
* **数组**（Subset）

它们的难度并不一样，但一般也可以在做题里起到帮助，因此单独抽出来形成一个板块。

我们第一个要学到的用法是割补。它是一种比较特殊的技巧。

## 例子 1 <a href="#example-1" id="example-1"></a>

<figure><img src="/files/HBkacy1l3k9E05O9ypaL" alt="" width="375"><figcaption><p>例子 1 - 割补推导部分</p></figcaption></figure>

如图所示。我们将视角调整到 `b5` 和 `c5` 之中。

在 `b5` 里，三角形的六个单元格里出现了 1、5、6、9 四个数，而 `c5` 的圆圈的六个单元格里出现了 7 和 8 两种数字。它们互不相同。

这能说明什么呢？仔细思考一下。`b5` 是三角形（6 个单元格）和菱形（3 个单元格）构成的，而 `c5` 是圆圈（6 个单元格）和菱形（3 个单元格）构成的。显然，菱形的 3 个单元格是两边公用的部分，而 `b5` 和 `c5` 都是数独规则所要求填满一套 1 - 9 的两个部分。

那么，刨去相同的菱形，就说明三角形的六个单元格的填数，和圆圈里六个单元格的填数应该是完全相同的。

当我们意识到这一点后，我们发现，1、5、6、9（三角形）和 7、8（圆圈）出现的六种数字互不相同，这说明，三角形余下的两个空格一定是 7 和 8，而圆圈里余下的四个空格也必须是 1、5、6、9。

当我们得到这一个结论后，我们继续往后看。

<figure><img src="/files/7aYn8EPw1Z1jYCFCHOfV" alt="" width="375"><figcaption><p>例子 1 - 宫排除部分</p></figcaption></figure>

如图所示。当我们得到前面的结论后，三角形位置 `r3c5` 就不能填 4 了（因为这个单元格是原本填 1、5、6、9 的部分，它压根没有填 4 的机会了）。而根据宫排除，我们可以得到，`b2` 里填入 4 的位置只剩下了 `r3c4` 了。所以，`r3c4 = 4` 是本题的结论。

我们把这个推理过程称为割补，用到的是数学上类似割补法的推理过程，通过加加减减的方式得到“两处看似没关系的部分是一致的”的结论。

## 例子 2 <a href="#example-2" id="example-2"></a>

下面我们来看另外一则例子。用法也是类似的，所以我觉得你可以自己理解它了。

<figure><img src="/files/yErAfEKSG8xBcIETiT6g" alt="" width="375"><figcaption><p>例子 2 - 割补部分</p></figcaption></figure>

这里我们有这样的割补的结构。然后我们可以得到一个宫排除的结论。

<figure><img src="/files/bAfQpssStYsCdMTEAdTB" alt="" width="375"><figcaption><p>例子 2 - 宫排除部分</p></figcaption></figure>

这个例子就希望你自行推理了。

## 例子 3 <a href="#example-3" id="example-3"></a>

<figure><img src="/files/XQZrGByrSl6vEFYqyzus" alt="" width="375"><figcaption><p>例子 3</p></figcaption></figure>

这个例子也希望你自己看。不过这一次我加大难度。请找出这个割补后可以得到的填数结论。

答案：`r4c1 = 4`。


# 直观区块

Direct Locked Candidates

接着，我们要学习的技巧是区块。这里需要注意一点。区块的英文名 Locked Candidates 是自带复数形式的。就是说，它的名字自身就是以复数形式表示。

## 宫区块（Pointing） <a href="#pointing" id="pointing"></a>

<figure><img src="/files/v4R3RTboPPLm01Mq4mL9" alt="" width="375"><figcaption><p>宫区块 + 行排除</p></figcaption></figure>

如图所示，我们可以看到，`b5` 此时只有两个空格。很明显我们能够知道的是，虽然我们并不能确定 8 究竟是 `r4c5` 填入，还是 `r5c5` 填入，但是由于它们俩同一列，所以 `c5` 填 8 的机会一定给到了 `r4c5` 和 `r5c5` 里的其一。

> 我们可以把 `r4c5` 和 `r5c5` 简写为 `r45c5`，即将 `r` 部分和 `c` 部分里一致的内容提出来，然后合并另一组的所有元素。同理，如果是 `r6c8` 和 `r6c9`，则可以合并为 `r6c89`。

而正是因为 `r45c5` 里有一个 8，所以 `r7c5` 肯定是不能填 8 的。换言之，如果 `r7c5` 是 8 之后，它会直接使得 `r45c5` 两个单元格都不能填 8（毕竟同一列），进而造成 `b5` 没有机会填 8，产生矛盾。

那么，我们记住这个结论。下面我们接着看 `r7`。`r7` 里此时还有三个空格尚未填入数字。首先，`r7c2` 不能是 8（上面有一个 8），其次是 `r7c5` 不能填 8。为啥不能填 8？因为刚才我们得到了它不是 8 的结论。这样一来，8 就只能填在 `r7c1` 了。所以，`r7c1 = 8` 是本题的结论。

这个技巧仍然是行排除。不过，它和一般的行排除有所不同：它用到了一处比较隐晦的临时推出结论——`r7c5` 不能是 8，也可以记作 `r7c5 <> 8`。

我们把其中 `r45c5` 的数字 8 称为关于数字 8 的**宫区块**（Pointing）。这个结构叫做区块，而宫区块的“宫”表示的是它是通过 `b5` 而得到的。

可以从结构里发现，它比较容易观察，所以和宫排除一样，我优先讲了宫区块。下面我们来看另外一则宫区块的例子，希望你自己理解它。

<figure><img src="/files/CHlszQrOkhSQjV1P5YCH" alt="" width="375"><figcaption><p>宫区块 + 列排除</p></figcaption></figure>

这个例子稍微麻烦一些。

> 宫区块在外国也叫**区块类型 1**（Locked Candidates Type 1）。

## 行列区块（Claiming） <a href="#claiming" id="claiming"></a>

下面我们来看一则利用**行列区块**（Claiming）的例子。

<figure><img src="/files/ZNZ8ATlPhnenCnMIcUmQ" alt="" width="375"><figcaption><p>行列区块 + 列排除</p></figcaption></figure>

这是一则比较难以理解的例子。

如图所示。我们优先可以得到的是，`r1` 里能填入 8 的位置只有 `r1c23`。这回我们把宫区块的思维反过来。因为 `r1` 里能填入 8 的位置只有 `r1c23`，而它俩刚好位于同一个宫里，所以 `b1` 的其他任何位置都没有机会填入 8。

没错，我指的是 `r3c3` 这个单元格。当我们得到这个结论时，我们可以利用它，配合 `r5c1` 和 `r7c7` 的数字 8 来判别得到 `c3` 填入 8 的唯一位置：`r1c3`。所以，`r1c3 = 8` 是本题的结论。

在这个例子里，`r1c23` 的数字 8 就可以被我们称为行列区块。具体一点，它是下在 `r1` 的区块，所以叫**行区块**。

> “`r1c23` 的数字 8”可以简单记作 `r1c23(8)`，使用小括号来表示我们结构里要表达的那个数字。
>
> 另外，行列区块在外国也叫**区块类型 2**（Locked Candidates Type 2）。

下面我们再来看另外一个例子。和前面的例子都不同，这次我们不借用排除填数，而是唯一余数。

<figure><img src="/files/1g2JxtFsYe1BRPxhHsP2" alt="" width="375"><figcaption><p>行列区块 + 唯一余数</p></figcaption></figure>

如图所示。我们优先可以得到的是 `r1c45(4)` 形成行区块，并得到 `r3c5 <> 4` 的结论。得到这一点后，我们通过唯一余数技巧，针对于 `r3c5` 进行数数操作。最终我们可以发现，2 是唯一一个可以填入的可能，所以 `r3c5 = 2` 便是这个技巧的结论。

这是配合唯一余数的使用方式。不论是从推理上来说，还是观察上来说，都会稍微有点难度一些。

## 组合区块（Cascading Locked Candidates） <a href="#cascading-locked-candidates" id="cascading-locked-candidates"></a>

有些时候，行列区块并不是很容易看到，所以我们可能会使用两个宫区块来代替。下面我们来看一个例子。

<figure><img src="/files/zOGVEsRcl5xyt77g4A5J" alt="" width="375"><figcaption><p>引例</p></figcaption></figure>

如图所示。这是一个行区块。我们暂且忽略它后面的逻辑。

我们可以试着看下右边两个宫里数字 7 的分布。使用宫排除的思路看 `b8` 和 `b9` 填入 7 的位置，我们发现它刚好构成了一个这样的形式：

<figure><img src="/files/01XikFjAaAjMyc6Aoo8V" alt="" width="375"><figcaption><p>组合区块</p></figcaption></figure>

我们使用排除，可以得到 7 的可填位置在 `b8` 和 `b9` 里只有这四处位置。按照排列组合的思维，我们可以知道的是，7 只有两种排列：

* `r7c5` 和 `r9c7` 同时是 7；
* `r7c7` 和 `r9c5` 同时是 7。

只有这两种情况。于是我们就知道，在 `r7` 和 `r9` 这两行里，7 的位置一定落在绿色的四个 7 里，所以别处无法填 7，于是这三处位置照样是可以去掉 7 的。

我们把这个图里使用的逻辑称为**组合区块**（Cascading Locked Candidates）。行列排除在部分情况下可以被组合区块所代替。当然，不能代替的情况也是存在的，因为它依赖的是边上的两个宫。如果边上这两个宫不能构成这样的形状的话，理解上就比较棘手了。

这个技巧只提供一种观察视角，专门用来代替找一些复杂的行列区块。当你找不着的时候，可以试试这个技巧；但是一般情况下，这个技巧都并不是很实用，所以只提供给你思维上的拓展。


# 直观数组

Direct Subset

接下来我们介绍的一个技巧叫做**数组**（Subset）。数组在使用上分两种模式，**显性数组**（Naked Subset）和**隐性数组**（Hidden Subset）。从底层上讲，它们是同一个东西，但是在推理上并不相同，而观察层面来说难度也不一样。所以我把他们分开讲解。


# 直观隐性数组

Direct Hidden Subset

## 隐性数对（Hidden Pair） <a href="#hidden-pair" id="hidden-pair"></a>

<figure><img src="/files/fLZ9S72V0q6CuCGgqsFI" alt="" width="375"><figcaption><p>隐性数对 + 列排除</p></figcaption></figure>

如图所示。我们使用排除的逻辑，看 `b1` 的数字 2 和 9，看看有什么说头。

我们发现，数字 2 在 `b1` 里只能填在 `r2c1` 和 `r3c2` 里，而数字 9 也恰好也只能填在这两个单元格里。倘若我们让 `r2c1` 是 2 之后，因为别处无法填 9 的缘故，此时就只有 `r3c2` 可以是 9 了；反之，如果 `r2c1` 是 9 的话，那么 `r3c2` 就得是 2，因为别处无法填 2。

我们把他们配对起来一起思考。它俩位于同一个宫里，这意味着什么呢？意味着这一个宫里填入 2 和 9 的机会只能落在 `r2c1` 和 `r3c2` 之中；而 `r2c1` 填一个数，`r3c2` 又填一个数，就把 2 和 9 名额给占满了。因此，这两个单元格就没有机会填入其他别的数字进去。刚好，我们发现其实 `r3c2` 如果不思考到这一层的话，它其实是可以填 5 的。但是如果有了这个约束后，就直接有了结论 `r3c2 <> 5`。

拿到这个结论后，我们再看 `c2`。我们发现，`c2` 里填入 5 的位置现在只剩下 `r6c2`。所以，`r6c2 = 5` 是本题的结论。

我们把这个技巧称为**隐性数对**（Hidden Pair），指的是 `r2c1` 和 `r3c2` 的 2 和 9 的排列。

> RCB 表达里，如果出现多个单元格无法使用前文归并的方式整合在一起，可以使用大括号将它们括起来，表示一组单元格，如 `{r2c1, r3c2}` 表示这两个单元格。
>
> 另外，数字 2 和 9 依然可以使用小括号括起来。不过这次我们可以直接使用一个小括号，就可以括起来。所以上面隐性数对的 RCB 表达是 `{r2c1, r3c2}(29)`。
>
> 至此我们就把 RCB 的全套规则全部介绍完毕了。之后我们会给各位列举一下它的一些详细规则。

下面我们再来看一则例子。希望各位这次能自己理解。

<figure><img src="/files/HMmYimJ0B5EV3644X72X" alt="" width="375"><figcaption><p>隐性数对 + 列排除</p></figcaption></figure>

## 隐性三数组（Hidden Triple） <a href="#hidden-triple" id="hidden-triple"></a>

可能你会问我，文章不是介绍数组吗，为什么名字却是隐性数对而不叫隐性数组什么的。实际上是因为，和区块一样，数组在分了显性数组和隐性数组后，还有规格上的划分。前面我们学到的是数组里规格为 2 的情况，它是数组里最小规格的情况。下面我们来说一下隐性数组在规格为 3 的情况。

<figure><img src="/files/UtGtS32gC7kSGMPGFwv4" alt="" width="375"><figcaption><p>隐性三数组 + 行排除</p></figcaption></figure>

如图所示。和前面的解释逻辑相似，只是这次我们要一并用到三个单元格。

只看 `b9`，我们可以看到，数字 1 能填入的位置只有 `{r8c78, r9c8}` 三个单元格，而恰好的是，数字 2 和 3 也都恰好只能填入在这三个单元格里。

很明显的是，数字 1 必须在其中预留一个席位，2 和 3 也都需要预留一个席位，这样三个单元格就被全部占满。这样一来，这三个单元格就没有任何机会填入其他别的数字。和前文一样，在没有这一层的逻辑之前，4 是可以填在 `r8c78` 里的；而现在我们有了 `r8c78 <> 4`，利用这一点，数字 4 在 `r8` 就只能填在 `r8c5` 里。所以这个题目的结论就是 `r8c5 = 4`。

我们把图中的 `{r8c78, r9c8}(123)` 称为**隐性三数组**（Hidden Triple）。

## 隐性四数组（Hidden Quadruple） <a href="#hidden-quadruple" id="hidden-quadruple"></a>

下面我们来看规格为 4 的情况。在平时做题里，规格为 3 和 4 的情况相对比较少见，所以我们只看下用例即可，平时做题基本遇不到这些题目。

<figure><img src="/files/Zpx94qlBuQExEMJ6vCox" alt="" width="375"><figcaption><p>隐性四数组 + 行排除</p></figcaption></figure>

这次我们仍旧关注于 `b9`，不过这次我们得看四种数字 1、4、6、7。

只看 1 的话，通过排除我们可以得到，`b9` 里填 1 的只有 `r89c79`（即 `r8c79` 和 `r9c79` 的缩写）四个单元格里。而 4 只能填在 `r89c7` 里，6 只能填在 `r89c79` 里，而 7 只能填在 `r8c79` 里。

这里和前面略有不同了。四个数字落在的单元格各不相同。不过，这并不是很重要，因为我们的本质是在排列数字的所填位置。而可填位置更少的 4 和 7 退一万步来讲也就是可能排列的位置少一些。我们优先保证它们填上，然后再去填剩下的 1 和 6。那么我们这样就可以得到一个和前文完全一致的结论——1、4、6、7 刚好用完 `r89c79` 四个单元格的席位，导致其他数字都填不进去。

填不进去的意义在于，例如数字 8，它就没有机会放在 `r9c79` 了。那么再使用关于 `r9` 的行排除，我们就有了 `r9c4 = 8` 的结论。

我们把这个技巧称为**隐性四数组**（Hidden Quadruple）。

这样，隐性数组的规格为 2、3、4 的三种情况就讲完了。

## RCB 表达的完整规则 <a href="#full-manual-of-rcb-notation" id="full-manual-of-rcb-notation"></a>

下面我们针对于前面用到的所有 RCB 表达进行一轮完整的说明。

### 纯单元格表示 <a href="#coordinates" id="coordinates"></a>

1. 对于单个单元格：直接用 `r<行号>c<列号>` 表示，其中 `<行号>` 和 `<列号>` 替换为具体的行列编号；
2. 对于多个单元格：
   1. 如果它们的行一致，或它们的列一致，则合并它们的行或列（只写一次），并列举另一边的所有编号数值：
      1. 如果合并后还具有相同的行号序列或列号序列，就还可以继续合并，直到无法合并为止；
      2. 如果合并后无法继续合并，就直接用这个结果表示即可。
   2. 如果它们的行号和列号都不一样，则直接用大括号括起来即可。

### 带有涉及数字的表示 <a href="#coordinates-with-digits" id="coordinates-with-digits"></a>

直接使用小括号把所有用到的数字括起来即可。

### 带有结论的表示 <a href="#coordinates-with-conclusions" id="coordinates-with-conclusions"></a>

1. 如果结论是得出一处单元格的填数（简称**出数**（Assignment）），则使用等号 `=` 连接单元格和数字；
2. 如果结论是得出某一个单元格不能填入什么数字或一组数字（简称**删数**（Elimination 或 Deletion）），则使用不等号 `!=` 或 `<>` 连接单元格和数字。

### 小练习 <a href="#rcb-notation-exercise" id="rcb-notation-exercise"></a>

下面我们来一些小练习：写出它们的 RCB 表达。

1. 单元格 `r2c3`、`r2c5` 和 `r2c9`；
2. 单元格 `r1c23`、`r2c234` 和 `r3c234`；
3. 单元格 `r1c3` 应填入数字 7；
4. 单元格 `r2c56` 不应填入数字 2 或 6；
5. 单元格 `r1c8` 的数字 1、2、3、5；
6. 单元格 `r1c89` 不能是 8 或 9；
7. 第 3 行；
8. 第 4 宫；
9. 第 2 列的全部数字 2。

答案：

1. `r2c359`
2. `{r1c23, r23c234}`，或者 `{r123c23, r23c4}` 也行
   1. 最好不要写成 `{r23c23, r23c4, r1c34}`，因为会多一项，可理解为数学上的“不是最简形式”
3. `r1c3 = 7`
4. `r2c56 <> 26`
5. `r1c8(1235)`
6. `r1c89 <> 89`
7. `r3`
8. `b4`
9. `c2(2)`


# 直观显性数组

Direct Naked Subset

说完了隐性数组，下面我们来学习显性数组的部分。

## 显性数对（Naked Pair） <a href="#naked-pair" id="naked-pair"></a>

<figure><img src="/files/PLtbOAoW4Xh48ausm8dH" alt="" width="375"><figcaption><p>显性数对 + 宫排除</p></figcaption></figure>

如图所示，这一次我们把思路转过来，不用数字作排除的逻辑，而是使用唯一余数的数数的逻辑。

首先看单元格 `r1c7`，我们可以直接确定的是，它只能填入 3 或 8 的其中一个数。而同列还有一个单元格 `r9c7` 也只能填入 3 或 8。

由于 `r19c7` 同列，所以它们不能填入相同的数字。所以就会出现此 3 彼 8 的排列。但是，不论是哪个数填在哪一个单元格，`c7` 的别处都没有机会填 3 或者 8。显然，`r4c7` 也不例外。所以，`r4c7 <> 8`。

得到这一点后，我们再来通过宫排除，可以得到 `b6` 的数字 8 只能填入到 `r4c9`，所以 `r4c9 = 8`。

我们把这个技巧称为**显性数对**（Naked Pair），指的是 `r19c7(38)`。

## 显性三数组（Naked Triple） <a href="#naked-triple" id="naked-triple"></a>

下面我们来看下规格为 3 的逻辑。

<figure><img src="/files/PS0e9HmWJTJF56N4Eknp" alt="" width="375"><figcaption><p>显性三数组 + 唯一余数</p></figcaption></figure>

我们先看 `r1c5`。这个单元格里可以填入的数字只有 1、2、6，别的数字在所在的行、列、宫里都有出现过了。其次再来看 `r3c4`。恰好，`r3c4` 也只能是 1、2、6。`r3c5` 也是如此。

由于 `{r1c5, r3c45}` 同一个宫里，所以不能填入重复的数字。而它们三个单元格都只能填 1、2、6，所以内部只能出现 1、2、6 三种数字的排列。我们拿出一个数字填入到一个格子里，然后在剩余的两个数字里选一个填入到第二个格子里，那么最后剩下一个数直接填入进去，三个单元格就会被 1、2、6 全部占满。

当得到这一点后，我们就可以知道的是，`r3c6` 也与这三个单元格同一个宫，不能填入相同的数。而这个宫里，数字 1、2、6 的填入机会已经给了 `{r1c5, r3c45}` 了，所以别的单元格都没有任何的机会填入它们。于是，`r3c6 <> 126`。

接着，我们可以通过这一点得到，`r3c6` 只能填入 8。

我们把这个技巧称为**显性三数组**（Naked Triple）。

## 显性四数组（Naked Quadruple） <a href="#naked-quadruple" id="naked-quadruple"></a>

和前面隐性四数组描述的内容一致，**显性四数组**（Naked Quadruple）的规格已经比较大了，所以在平时做题的时候很难能够遇到这样的结构，所以带着大家看一下就行了。

<figure><img src="/files/4qqZT0y7ZnhtMvHuNT2t" alt="" width="375"><figcaption><p>显性四数组 + 宫排除</p></figcaption></figure>

如图所示。观察 `b7`，我们通过唯一余数的操作可以依次得到 `r7c3` 只能是 4、6、7、9，`r8c2` 只能是 4、9，`r8c3` 只能是 4、7、9，`r9c3` 只能是 4、6、7。

虽然这四个单元格的可能填数是“参差不齐”的，但是可以得到的是，在 `b7` 里，数字 4、6、7、9 的排列只能在 `{r8c2, r789c3}` 这四个单元格里。

当我们得到这一点后，我们就可以知道，6 这个数在 `c3` 的别处都没有机会填入（当然，`b7` 的别处也一样）。所以，我们就有了 `r6c3 <> 6` 的结论。

然后，我们再根据宫排除得到 `b4` 的宫排除结论：`r6c2 = 6`。

这里的 `{r8c2, r789c3}(4679)` 就是我们要说的显性四数组了。

至此我们就把显性数组的逻辑讲完了。


# 直观复杂出数

Direct Complex Single

前面我们学习了区块和数组的使用，我们发现它是用于辅助排除和唯一余数技巧出数得到结论的技巧。它们自身由于无法出数，所以使用上会出现复杂的用法。

前面我们接触到的都是只需要一个的情况。但是这样的出数显然比较简单，下面我们来看一些复杂的出数逻辑，需要依赖更多的区块和数组在同一个步骤之中。

## 串行使用 <a href="#sequential-usages" id="sequential-usages"></a>

我们先来看思维比较清晰的串行用法。

### 例子 1：宫区块 + 隐性数对 <a href="#example-1" id="example-1"></a>

<figure><img src="/files/jYWpwLY53d2yPdCZcvTF" alt=""><figcaption><p>宫区块 + 隐性数对 + 宫排除</p></figcaption></figure>

如图所示，我们先看左边的图，然后再看右边的图。左图里展示的是一个宫区块，得到的是 `b5` 的 6 区块结构。于是，我们可以得到 `r4c2 <> 6` 的结论。

然后利用这一点，我们可以得到右图“隐性数对 + 宫排除”的结论：因为 `r4c2 <> 6`，所以 `c2` 的 6 就只能卡在 `r35c2`，于是这两个单元格就只能是 4 和 6，构成隐性数对。

接着，得到结论之后，`r3c2 <> 5` 的结论就有了。于是我们根据宫排除得到 `b1` 内填入 5 的位置只能是 `r3c3`。所以 `r3c3 = 5`。

接着我们再看一个例子。

### 例子 2：宫区块 + 列区块 <a href="#example-2" id="example-2"></a>

<figure><img src="/files/AMh7NWv1oQX5TOP6J5Op" alt=""><figcaption><p>宫区块出列区块</p></figcaption></figure>

如图所示。这个题先看这一部分的推导。先是左图。

可以看出，因为数字 3 对 `b9` 的排除效果，我们可以得到 3 只能填在 `r8c7` 和 `r8c8` 的其中一个单元格里，使之形成关于 3 的区块。在有了这个区块之后，我们可以知道，同一行上别的地方都不能填 3，于是就有了右图 `r8c5` 和 `r9c5` 都不能填 3 的结果。

接着，我们再把视角转向 `c5` 上。我们可以看到，列上 3 只能填在 `r1c5` 和 `r2c5` 之中，因此，列区块就形成了。

<figure><img src="/files/tuv1B1uHI23Qolx5aZ4l" alt="" width="375"><figcaption><p>最终得到了行排除结果</p></figcaption></figure>

如图所示。这样我们再次使用关于数字 3 的行排除，就可以得到 `r3c8 = 3` 的结果了，因为此时 `r3c4` 是不能填 3 的，于是 3 就只剩下一处可填位置了（其他两处是由圈起来的数字 3 可以直接排除掉的）。

## 并行使用 <a href="#parallel-usages" id="parallel-usages"></a>

前面的例子是一步一步这么下来的。下面我们来看一个出数需要同时直接依赖两个区块的例子。

### 例子 3：两个宫区块 <a href="#example-3" id="example-3"></a>

<figure><img src="/files/uQO3S7GnX5CbfH80J3lB" alt="" width="375"><figcaption><p>两个宫区块 + 唯一余数</p></figcaption></figure>

如图所示。`b7` 有个 5 的宫排除。我们先忽略它（实际上也帮不上什么忙）。

我们先对 `b2` 和 `b8` 分别作排除，可以得到这两个宫具有 1 和 2 的宫区块结果。然后我们发现，它们刚好都是竖着长的，所以 `r5c5` 刚好位于它俩的“作用域”上，所以 `r5c5 <> 1` 和 `r5c5 <> 2` 可以同时得到。

然后，我们针对于 `r5c5` 使用唯一余数，可以得到 `r5c5 = 9` 的结论。

## 练习 <a href="#exercise" id="exercise"></a>

下面给各位预留一个题目。这个题的结论出在 `r5c5`。

<figure><img src="/files/5ejKeQTZkTiYt8OaLb6B" alt="" width="375"><figcaption><p>一个比较难的练习题</p></figcaption></figure>

这个题在知道答案之前确实挺难，所以我打算给各位再多一个提示。请注意盘面的数字摆放，可以看出，如果把蓝色的数字抠掉，可以看出数字的摆放是中心对称的。这可能意味着一些比较神奇的特征。


# 做题策略・标记

Strategying Phase Ⅱ

新篇章的内容难度会比直接直观来说要难不少（主要还是逻辑理解上会难一些），需要过渡。这里我们补充一部分的内容为了后续作铺垫用。这个概念确实也很重要，所以必须要有衔接。


# 候选数的概念

Concept of Candidate

我们先来学习一下**候选数**（Candidate）的概念。

## 什么是候选数？ <a href="#what-is-candidate" id="what-is-candidate"></a>

候选数指的是，某一个单元格在尚未填入数字的状态（也就是空格状态）下，它可以填入的数字都有哪些。这一个一个的“填数的可能性”，都是一个候选数。

我们拿这个题来举例。

<figure><img src="/files/8g3tq1cmqidDU8bkngd4" alt="" width="375"><figcaption><p>候选数举例</p></figcaption></figure>

如图所示。别看着里面密密麻麻的数字就产生了惧怕的感觉。

比如说，我们尝试只看 `r5c4`，我们可以通过唯一余数的方式来确定它可以填入哪些数。显然，这个所在宫里有 7 个数已经填出，所以还剩下两种数字没有填了，那它必须就只能是 7 或 9。

但是，似乎 `r5c4` 所在的行和列上也都没有额外的 7 和 9 的信息可提供种类的排除，所以最终这个单元格只能填 7 和 9。我们就把 `r5c4(7)` 和 `r5c4(9)` 称为 `r5c4` 单元格的候选数。注意，一个候选数是一个填数可能，所以 `r5c4` 是有两个候选数的，是这么个理解方式。

这个理解起来并不是很难。难就难在，我们需要严格地将每个单元格的可能性全部标注出来。它是一个不小的工程量，在每一次做到这种难度的题的时候，标注它们都是非常难受的。现在市面上大多数的 app 都会提供“一键全标”的功能，使用这个功能会自动给所有单元格标记上全部的候选数，方便了很多。但与此同时，玩家也会丢失数感。什么是数感？这个我在唯一余数的技巧里有提及，大概就是说，你在数 1 - 9 里缺少啥的这个能力。越快当然就越好。

我建议你多练习数数的操作，以便使用方便的功能的时候能力上的退化。

> 另外，我再补充一句。候选数在盘面里，都会采用这样对齐的方式摆放。其中数字 1、2、3 放在空格的第一层，4、5、6 在第二层，而 7、8、9 在最后一层。这个摆放有个好处是方便我画图。你看着也会比较整洁一些。比如 `r8c8` 只有 7 和 8 这两个候选数，此时只在 7、8 的固定位置上标记候选数，很容易会让你知道其他候选数是不存在的，这样方便你横向对比候选数状态。

## 约定俗成 <a href="#convention-of-candidate" id="convention-of-candidate"></a>

在后续的篇目里，我会采用这个方式讲解技巧的推理过程。当然，这非常的没必要（因为大多数时候并不是全部的候选数都会用上），但是这样讲解是让你习惯这个视角做题，其次是方便我讲解和制图。因为局部的候选数不便于我制图……

另外，从本文开始，后面的全部内容将以删数形式呈现全部技巧的推理过程。这种难度的题也不能更好让你去出数了，所以只能按删数为单位去讲解它们了。

## 关于技巧的分类 <a href="#category-of-techniques" id="category-of-techniques"></a>

为了表述方便，这里给大家列举一下所有数独技巧的分类。

### 做题模式的分类 <a href="#category-of-candidate-visibility" id="category-of-candidate-visibility"></a>

* **直观**（Direct）：指的是玩家不需要依赖任何候选数，只使用出数技巧（产生出数结论的技巧，也就是排除和唯一余数）就可以完成题目的做题模式；
* **局部标记**（Partial-Marking）：也叫局标。指的是玩家在无法直接使用排除和唯一余数的时候，借用一些局标技巧（即割补、区块和数组）进行辅助，排除一些可能性，但又不需要依赖整个盘面都严格标上候选数的做题模式；
* **全部标记**（Full-Marking）：也叫**全标**。指的是玩家在尝试局标技巧后，题目仍然没有显著难度降低的时候，不得不采用全套候选数的视角去做题，也就是后面我们要介绍的一些技巧，依赖它们才能做题的模式。

### 技巧的分类

既然有了做题模式的分类，那么技巧的分类也就有了。

* 直观技巧：只在直观模式下做题才会用的技巧，也就是排除和唯一余数；
* 局部标记技巧：也简称为局标技巧，也就是在局标视角下做题的技巧，即割补、区块和数组这三个；
* 全部标记技巧：也简称为全标技巧，就是不得不全标才能解题的技巧，即数组以上的其他技巧；
* **非直观技巧**（Indirect Technique）：即直观技巧范围的取反，包含所有的局标技巧和全标技巧，也称为**候选数技巧**（Candidate Technique）。

即这个分类：

<figure><img src="/files/SbxUdY4ZRNBFwuNw3y4M" alt=""><figcaption><p>技巧的分类图</p></figcaption></figure>


# 直观和局标技巧在全标下的样子

Looking of Direct & Partial-Marking Techniques in Full-Marking Grids

为了更好地衔接后续的技巧，我还是想贯彻之前教程的样子，单开一个篇目给各位介绍一下前面全部数独技巧，在全标状态下的样子。

当你在看到这些长相后，你以后就不愁看不懂后续下结论的时候为啥图长那样了；另外，我发这些图也是为了体现一下配色方案的约定俗成。后面所有的技巧，配色方案都会采用这样的方式来给各位展示，就不再变动了。

## 唯一余数 <a href="#naked-single" id="naked-single"></a>

先说唯一余数。

<figure><img src="/files/ZS0kE1QgMvgZw5zBKUAH" alt="" width="375"><figcaption><p>唯一余数用例</p></figcaption></figure>

可以看到，唯一余数的结论是 `r9c1 = 1`。不过如果你忽略掉圆圈的话，其实可以看到的是，这个位置其实就一个候选数。这便是全标状态下最简单的情况。候选数的由来不就是数数么。既然只有一个候选数，那么自然它就是唯一余数了。

之所以全标模式下，把唯一余数放排除之前，有个重要的原因就是，因为它更适合在全标模式下使用。我们大家都知道唯一余数在直观层面都难找得很。但是在全标状态下，它都很容易被发现。所以，当你在做全标题目的时候，就适当调整一下技巧的优先级次序。

## 排除 <a href="#hidden-single" id="hidden-single"></a>

<figure><img src="/files/ANsPIoyNMX30PAfTGd7t" alt="" width="375"><figcaption><p>排除用例</p></figcaption></figure>

如图所示，排除的话会稍微麻烦点。

在全标视角下，虽然你仍然可以使用 `r2c3` 和 `r6c2` 的数字 6 来作排除，但是我不是来说这个的。在全标下，`b7` 里填入 6 的位置只有 `r8c1`。你可以仔细看看 `b7` 里所有空格的候选数排列情况。显然，只有 `r8c1` 有 6 这个候选数，而别的三个格子都没有。所以，不是你填还能是谁填？

## 区块 <a href="#locked-candidates" id="locked-candidates"></a>

<figure><img src="/files/yHnrvfqgQQ6dC8TeLtQZ" alt="" width="375"><figcaption><p>宫区块用例</p></figcaption></figure>

如图所示，直观视角我们可以使用数字 4 来作排除。不过在全标下，我们需要看的是候选数的分布。在 `b1` 里，数字 4 只出现在 `r12c2` 里，这样就有了区块的概念了。

然后根据区块，我们可以得到 `r69c2 <> 4` 的结论。

这个是宫区块，因为区块下在 `b1` 里。下面给各位看一则行列区块的例子。这个例子给各位自己看了吧。

<figure><img src="/files/A1nTMYt6W3ZXUolMmJtE" alt="" width="375"><figcaption><p>行列区块用例</p></figcaption></figure>

## 显性数组 <a href="#naked-subset" id="naked-subset"></a>

下面我们来看显性数组。

<figure><img src="/files/4ElRfKkfSie1zJ3f27Qu" alt="" width="375"><figcaption><p>显性数对用例</p></figcaption></figure>

如图所示，这个题的结论是 `r46c3 <> 69`。当然很明显 `r4c3` 也没有 9，只是这里我们用这个结论把它表达写简单一些。

下面我们来看一下显性三数组和显性四数组。

<figure><img src="/files/pBtkHPZFTBGnw8Djm6td" alt="" width="375"><figcaption><p>显性三数组用例</p></figcaption></figure>

然后我们来看显性四数组。

<figure><img src="/files/6oBYwuCBxdXoBQKIXzCV" alt="" width="375"><figcaption><p>显性四数组用例</p></figcaption></figure>

## 隐性数组 <a href="#hidden-subset" id="hidden-subset"></a>

<figure><img src="/files/sRTIeD6qH3KmxiJUi7v8" alt="" width="375"><figcaption><p>隐性数对用例</p></figcaption></figure>

如图所示，这是个隐性数对。从全标下来说，`b6` 填入 5 和 8 的位置只有 `r56c7` 两个单元格。所以，`r56c7` 不能填入其他任何的数字。

可以看到，它除了这些结论外，还有别的结论。这是因为，在去除掉 `r56c7` 的其他数后，它就只剩 5 和 8 了，会变成一个显性数对。然后，我们又可以得到同列的别处不能填 5 或 8 的结论。

这里是我把这两个逻辑整合在一起了，因为只要出现这种样子的数对，就必然会从隐性数对变为显性数对，然后删掉同列别处的位置（当然，也不一定非得同列，可以同行或同宫）。

下面我们来看隐性三数组和隐性四数组。先是隐性三数组。

<figure><img src="/files/3lXQSJxFR5dRxY7o2NLs" alt="" width="375"><figcaption><p>隐性三数组用例</p></figcaption></figure>

再来看看隐性四数组。

<figure><img src="/files/94EWmOUyCzgWDxjdinkZ" alt="" width="375"><figcaption><p>隐性四数组用例</p></figcaption></figure>

## 数组显隐性互补的性质 <a href="#complementary-property-of-subset" id="complementary-property-of-subset"></a>

### 互补性质解释 <a href="#explanation-of-law-of-complement" id="explanation-of-law-of-complement"></a>

可能你会好奇，为什么之前我在介绍数组的时候，规格只到 4。是不存在 4 以上的情况吗？还是说它过于罕见导致没有题或者不想讲（反正也遇不到）的原因吗？

实际上不是的。在最开始我们就提过一点，数组其实只有一种，只是因为视角不同被分成了两种形态。分成两种形态的原因自然是观察难度的不同，以及逻辑推理的不同。但是从本质上来说，其实它们是一样的东西。

下面我们来看一则例子，以说明这两个最终是等价的。

<figure><img src="/files/qsXntgQGYi9RBv2LuOhj" alt=""><figcaption><p>互补例子 1</p></figcaption></figure>

请看这个题目。这个题目存在一个隐性数对结构（左图），删除的数字是图中红色的 6 个数字；而这图同样的宫内存在一个显性四数组（右图），删除的也是这 6 个数字。

这冥冥之中告诉我们它很有可能不是巧合，就是故意这么安排的。那么，这是题目的设计如此么？我们再来看一个例子。

<figure><img src="/files/iJPYQDPrNxlGMD9XD5KO" alt=""><figcaption><p>互补例子 2</p></figcaption></figure>

如图所示。这是另外一个题目。这个题目左图有一个显性数对，它的结论是这三个删数；右图是在同样的行上存在一个隐性三数组，它的结论仍然是这三个删数。

可能你会有所疑惑。两个数组涉及的数字都不一样，凭什么删数恰好都能完全一样呢？这真的不是巧合吗？

不是的。它不是巧合。它就是数组的一个特征，**显隐性互补**（Law of Complement）：

**如果你发现了一个显性数组，那么这个所在的区域下，同时也存在与之互补的隐性数组，使其删数完全一致。另外，显性数组的规格和隐性数组的规格，应等于整个这个区域下的空格数量。反之亦然。**

怎么理解呢？比如说例子 1，`b4` 里一共有 6 个空格。其中隐性数对是 2 个单元格，显性四数组是 4 个单元格，刚好满足 2 + 4 = 6 的情况；而例子 2 里，`r3` 里一共有 5 个空格。其中显性数对是 2 个单元格，隐性三数组是 3 个单元格，也恰好满足 2 + 3 = 5 的情况。

这个互补特征客观成立的点，在于显隐性数组两方，使用的单元格刚好不同。所谓“刚好不同”，是说显性用的格子，隐性一个都不会用。反之亦然。而整好，显性数组用的格子和隐性用的格子全部列到一起，就是整个这个区域下的所有空格。这是互补的本质原因。

那么，这种互补为什么就奏效了呢？请仔细思考一下。显性数组的删数和隐性数组的删数特征都是什么？显性数组一定删的是数组用到的这些数字，而隐性则刚好相反。举个例子。如果一个显性数对用的数字是 5 和 8，那么它的删数也必须得是 5 和 8。而如果一个隐性数对是 5 和 8 的话，那么它的删数只可能是 5 和 8 外的其他所有数字（1、2、3、4、6、7、9 这些）。从数字上讲，它们删数的“取值范围”是互补的——能够凑成一组完整的 1 - 9。

只要我们保证单元格使用完全用满全部的空格，那么所有的数字由于自身就是互补的删数状态，那么我们就可以使得视角从显性转为隐性，或者隐性转为显性，而删数可以保持纹丝不动。

### 为什么数组规格不超过 4？ <a href="#why-size-of-subset-is-not-greater-than-4" id="why-size-of-subset-is-not-greater-than-4"></a>

下面我们来解释另外一个问题。为什么我们学到的数组，规格只有 2、3、4 三种情况呢？这里我们要稍微用一下数学不等式的思维，不难的，请放心。

首先，我们知道，显性数组和隐性数组的规格总和等于这个区域下所有的空格数，那么我们使用字母 $$c$$ 来表示指定元素的数量的话，那么我们不难得到这个式子：

$$
c\_\text{显性数组}+c\_\text{隐性数组}=c\_\text{空格}
$$

我们将它们移向等号的同一侧，然后使用 $$c\_\text{非空格}=9-c\_\text{空格}$$ 的说法将其代换一下，于是我们就有了：

$$
\begin{align\*}
c\_\text{显性数组} + c\_\text{隐性数组} &= c\_\text{空格}\\
c\_\text{显性数组} + c\_\text{隐性数组} &= 9 - c\_\text{非空格}\\
c\_\text{显性数组} + c\_\text{隐性数组} + c\_\text{非空格} &= 9
\end{align\*}
$$

我们使其这么进行一轮式子变形，就有最下面的这个结果。

我们将这里的数字 9 当成一个定值，而不是一个具体的数。既然是定值，那么我们就知道，左边三个数的和一定是个固定结果。

由于求和等于定值，这意味着左边三个元素，一旦有其中一个数变大，那么剩下两个数的和，结果一定就会变小，才能保证结果是一个定值。

我们不妨为了让 $$c\_\text{显性数组}$$ 和 $$c\_\text{隐性数组}$$ 两个数都尽量大，那么我们只好让 $$c\_\text{非空格} = 0$$ 了。那么这个式子在极端情况下会变为这样：

$$
c\_\text{显性数组}+c\_\text{隐性数组}=9
$$

现在我们知道，显性数组和隐性数组的关系一定是一个变大另外一个就会变小的。那么，其中一旦有一个数超过了 5，另外一个数就会变到 4。变为 4 意味着这个数：

1. 保持求和为 9；
2. 比互补的那个数组的规格要更小。

尤其是第二点。比如说显性数组规格开始等于 5 了，那么隐性数组就必须等于 4 以保证求和结果为 9（如果还有非空格的话，那么这个数还会更小）。但是，就这么光看极端情况的话，4 就已经比 5 还小了。这就说明了一点：我们无法让数组规格超过 5——因为互补的那一边一定会有一个规格更小的在等着呢。

这就是为什么数组没有规格超过 5 的情况：虽然理论成立，但实际上根本派不上用场。

### 高规格数组内可能会有低规格数组 <a href="#lower-sized-subset-can-exist-in-large-sized-subset" id="lower-sized-subset-can-exist-in-large-sized-subset"></a>

有些时候，互补过去可能看起来并不是那么正常。下面我们来看一则例子。

<figure><img src="/files/U6nnXxiv0oNWvSJ3Yk1j" alt=""><figcaption><p>互补不正常的情况</p></figcaption></figure>

如图所示，左边是一个隐性数对。按道理来说，取出其他空格就可以直接转为显性四数组（因为空格就 6 个，2 + 4 = 6）。

但是仔细看一下，其实不难发现到的是，右图的数组 4、6、7、8 其实是不太合理的。因为它其实可以只用三个单元格：`r8c236` 就行。这三个单元格的数字 6、7、8 已经足够构成显性数组。把 `r8c7` 招揽进来看起来并不是那么合理。

这个问题我们要先从互补性出发来解释它。首先，互补的时候，我们需要取出 `r8` 里所有没用到的空格一并形成数组结构，这使得冗余的部分 `r8c7` 会被纳入进来。其次，从规则上讲，显性数组本身就是看单元格内部是否在排列上形成占满的思维。三个的很好理解，四个的其实也不是不能理解。强行理解的话，你可以认为里面仅出现了 4、6、7、8 四种不同的数字，刚好在四个单元格里。为了尽量保证数组内部填充不会出现矛盾状态（数字重复什么的），我们会优先先去给可填位置更少的数字优先安排空格填进去。显然，数字 4 只有一处位置可填，所以我们“暂时”让 4 填在 `r8c6`。然后，其他的 6、7、8 分别安排在旁边的三个单元格 `r8c236` 里，似乎也不是不能形成四数组的形式：确实 4、6、7、8 把四个格子的填数机会给占满了。既然席位全部使用完了，那么我们自然就不难想到，同一行的其他单元格就没有机会填入 4、6、7、8，自然就可以使其产生合适的删数。只不过，这里的 4 安放尤为特殊：它仅有一处可填。仅有一处可填意味着 4 最终的摆放只可能在这个单元格上。

这是最难理解的点，也是破解这种奇怪的数组的关键点。数组的本质是，里面只能填入这些数字。“只能”意味着数字不论如何，在这个区域的别处，都不会填入，而填写的最终位置，尽可能在数组内部的这些格子里进行排列组合。如果它有两处，那么最终数组涉及的这个/这些数字，就只有这两处位置放，不是 a 就是 b；如果有三处，就是 a、b、c 来回换呗。那如果就一个位置呢？那我们只能让它就是这个数了。

如果你还理解不了，也没有关系。大不了你回去看看这个题。这个题里，6、7、8 的显性三数组是客观成立的。倘若我们先找到的是这个三数组，那么 4 就不会被纳入进来的话，那么它的删数就会算上 `r8c7(78)`。而要使得这个 4、6、7、8 显性四数组整体成立，`r8c7` 客观上还真不能存在除了 4、6、7、8 以外的数。那么，既然三数组成立了，`r8c7(678)` 就都能删掉。删掉之后，不就真只剩一个数了么？直接唯一余数，得到 `r8c7 = 4`。

不论哪种理解方式，这种情况都是可理解的。换言之，这种数组合法，但是有病。说这个的目的是告诉你两点：

1. 有些时候，显隐性互补后会补出来一个合法但有病的数组。这种数组的特征是，规格很大，但内部其实存在一个规格更小的数组，换言之，其中有一些格子可以不用，数组照样能成立；
2. 显隐性互补的特性在这种情况下用起来并不爽，而我们强行去理解它的本质，其实还是为了使得显隐性互补这个规则，在任何时候都客观成立，仅此而已。

那么，右图里的 `r25c7(4)` 的删数为什么成立，想必就不用我多解释了吧。

好了，所有直观技巧和局标技巧的全标状态就说完了。从下一篇文章开始，我们将正式进入到后续技巧的学习之中。


# 笔记的概念

Concept of Notes

下面我们来看如何快速确定数字是否存在可用填数位置的办法。

## 笔记的概念 <a href="#find-available-positions" id="find-available-positions"></a>

现如今电子产品越来越多，玩家更多会采用手机、iOS 等设备使用数独相关 app 游玩数独的游戏。主流的一些数独产品里会提及一种全新的概念。这个概念在早期尚未让数独游戏在电子设备上风靡的时期是没有的。

当用户在使用 app 的时候，按钮里多数会提供一个功能，它可以快速让我们进入到候选数的状态，即前面看到的全盘都有候选数的这个状态。这个功能在应用端一般称为**一键笔记**或**自动笔记**（Auto Notes）。其**笔记**（Note）的概念需要我着重说明一下。

所谓笔记，指的是玩家可操作的候选数单位。是的，它就是候选数，不过是从行为上判断的。当我们在一个直观的盘面上找一些辅助技巧（如我们需要区块排除，此时可能会依赖于区块）的时候，我们方便之后的步骤可能继续使用该位置的结构，我们可能会临时作出标记，避免遗忘。所谓的笔记，就是你往盘面里填充的候选数。它是一点一点往上标的，所以才称为笔记，因为它就跟笔记一样是一点一点写的。

虽然笔记也可能全盘标记，但我们仍然将其称作笔记而非候选数，并不是因为它不是候选数，而是因为它这种行为是我们所需要强调的。

## 全笔记盘面的快速定位 <a href="#quick-locating-in-full-notes" id="quick-locating-in-full-notes"></a>

当你标记了笔记后，你看到的盘面可能是这样的：

<figure><img src="/files/zag3TURKwyfRSanfhZro" alt="" width="375"><figcaption><p>全盘笔记后的样貌</p></figcaption></figure>

如图所示。针对于这种盘面，我们一般会有如下两种直观技巧可用。

### 隐性唯一（排除） <a href="#hidden-single" id="hidden-single"></a>

为了强调，我按照数独 app 的习惯展示数字的高亮效果：

<figure><img src="/files/2mzU3rodjgsSPCDKaoxB" alt="" width="375"><figcaption><p>隐性唯一</p></figcaption></figure>

如图所示。我们会显然发现，`b1` 和 `b4` 的高亮非常“稀疏”。对于 `b1` 而言，很显然我们知道的是，数字 1 能填入的位置就只有 `r2c3` 这一个位置。那么自然结论就很明显了，它就是必须填 1 的，否则 1 就没位置填了。因此，`r2c3 = 1` 就直接可以得到。

从直观的角度来看，这其实就是一个很简单的排除，而且是宫排除（毕竟 1 是在 `b1` 这个宫内出的）；但在笔记标满了的情况下，玩家可能不会按提示数 1 去找排除项，所以这个 1 的本质定位是依赖的“宫内就这一个高亮位置”的思维方式上的。这个逻辑我们在数独里也有名字，叫**隐性唯一**（Hidden Single）。隐性唯一和隐性数组的取名是一致的，因为它在笔记全开的情况下确实是隐藏在盘面之中。虽然隐性唯一本身比隐性数对、隐性三数组这些情况更容易看到，但客观事实是，它确实是藏在盘面里的，你必须要先聚焦于某个行列宫里，确保它真的只有一处可填位置，那么它才能是结论。

哦对，`r7c7 = 1` 可以通过 `r7` 得到隐性唯一的结论。所以，隐性唯一并非只会发生在宫里，只是说宫内的隐性唯一最好定位到。

### 显性唯一（唯一余数） <a href="#naked-single" id="naked-single"></a>

**显性唯一**（Naked Single）就更轻松了。恰好和前一节的内容匹配，显性唯一其实就是唯一余数。只是说，唯一余数看的更侧重于直观，即利用提示数和自己填入的数字来进行推导，但如果你已经笔记标满了，那就大胆一点。

<figure><img src="/files/Nwl4zFEaFp23T8fY6mLH" alt="" width="375"><figcaption><p>显性唯一</p></figcaption></figure>

如图所示。这四个单元格刚好只有唯一的一个笔记。如果你的笔记是确实标全了，那么这四个位置的唯一可填数字必然是这四个单元格的结论。

## 区块定位 <a href="#locating-on-locked-candidates" id="locating-on-locked-candidates"></a>

### 宫区块定位 <a href="#locating-pointing" id="locating-pointing"></a>

我们换一个题。这次尝试一下给各位不展示其他数字的笔记。

当我们要定位区块的时候，我们只需要找到这个区块的笔记位置，然后确保它能够按前一节描述的那样形成区块即可。

<figure><img src="/files/LEBfDdwkLZrB5vlxeJ9W" alt="" width="375"><figcaption><p>区块定位</p></figcaption></figure>

如图所示。当我们知晓数字 6 的所有可填位置有这些时，那么我们必须要形成一个意识和快速判断的方式：很明显，`r1c8` 和 `r2c9` 是不能填 6 的。

这个思路依赖于宫区块的特性——宫内得到只能在同一个行/列上填数。显然，`b1` 就能够形成非常清晰的、数字 6 的区块。同理，`b6` 也是如此。

当我们快速得到这两个区块后，我们自然会有一个结论：`b3` 里填 6 的位置就只有右上角这个 `r1c9` 了。这便是区块技巧的定位的方式。

### 行列区块定位 <a href="#locating-claiming" id="locating-claiming"></a>

<figure><img src="/files/9zIi9bPD6VfZTiF1dNBv" alt="" width="375"><figcaption><p>行列区块定位</p></figcaption></figure>

如图所示。很显然，行列区块就没那么好看了。

这个题里数字 8 就藏了一个行列区块在里面。在哪里呢？`r2` 上。我们只需要确保数字 8 在某个行列上只会出现在同一个宫里就行。也就是反过来看。很显然，数字 8 在 `r2` 上就是行区块。

那么受影响的位置呢？显然就是图里的 `r1c3` 和 `r3c13` 了。这些位置不能填 8。接着呢？接着我们可以用一下前面组合区块的内容：因为 `b17` 里 8 此时已经形成了组合区块，所以 `r4c2 <> 8`，于是 `b4` 就可以填出数字 8 的确切位置了：`r4c1 = 8`。是不是很巧妙？

当然了，打一开始 `r2` 形成区块之前，8 就客观存在组合区块的技巧，因为它不受 `r1c3`、`r3c13` 这三个单元格删除 8 的影响。而且，就算行区块有了之后，删除 8 的情况后，`c1` 上就有了隐性唯一。不过，从初学的角度而言，我个人并不认为玩家可以立刻看见 `r2` 的行区块和出了区块结论之后得到的这个隐性唯一。可能更多的玩家会按部就班地进行区块删数，然后组合区块删数，然后出数的三步流程，毕竟，除了第一步的行区块确实比较困难以外，组合区块和最后 `b4` 里出 1 的隐性唯一的这个做法确实都只依赖于宫这种区域类型，它比较容易看见。

不管怎么说，无论你使用哪一种思路，行列区块的定位就是这样，只需要将宫区块的逻辑反过来找就行了。

## 循环态的概念 <a href="#concept-of-cycling-pattern" id="concept-of-cycling-pattern"></a>

既然你习惯了笔记的内容，那么这里不得不为各位介绍一下数字是否还存在前文所描述的结论的办法。

<figure><img src="/files/5ImLv44kjCg2W176g6O5" alt="" width="375"><figcaption><p>循环态介绍</p></figcaption></figure>

如图所示。这还是刚才那个题，不过我换了一个数字高亮呈现。很显然，数字 1 此时一定存在两种填法：

* `r4c7` 和 `r8c8` 填 1；
* `r4c8` 和 `r8c7` 填 1。

这两种情况似乎填哪种都不会影响后续填数的逻辑。换言之，我们没有任何办法可以立刻判断出来这两种填法哪一种正确。我们把这种 1 的摆放效果称为**循环态**（Cycling Pattern）。

对于这种循环态，我们是具有一些快速判断的办法的。只要一个数字的所有摆放位置形成了循环态，那么我们就可以认为这个数字目前不能有结论，于是我们需要跳转到别的数字再看。

很显然，上面的例子里数字 1 是形成了一个可置换的情况的。但是，这种可置换的情况看起来还比较简单，所以不费吹灰之力我们就可以知道它不能填数；不过更多的时候它不会这样。

<figure><img src="/files/TJV4uRHUkk0pwBzHjPit" alt="" width="375"><figcaption><p>数字 4 的循环态</p></figcaption></figure>

如图所示。同一个题里的数字 4 也是循环的。它和数字 1 的循环态的区别只在它多用了一个宫——数字 4 用了三个宫。不过，把 4 提取出来就可以发现，每一行、每一列和每一个宫都有两个可以填充的摆放位置，我们显然无法正确定位它的具体填法，所以它也是循环态。

<figure><img src="/files/EVK0BgzJJunIEi1nHXxI" alt="" width="375"><figcaption><p>数字 8 的循环态</p></figcaption></figure>

如图所示。这种也属于循环态。看起来分配的位置有很多（足足 8 个可填位置），但实际上是俩独立的组合区块。这很显然无法造成可用结论。

<figure><img src="/files/nJSSSaSXEp3IwgT4iuTR" alt="" width="375"><figcaption><p>数字 2 不是循环态</p></figcaption></figure>

如图所示。数字 2 就不是循环态。这看起来非常复杂，不过没事，本身也确实有问题。可以看到 `b4` 明显形成了区块，所以至少可以去掉 `r3c1(2)` 这个情况。

不过余下的结构是否是循环态，我们还需要更为复杂的讨论。按照循环态的标准定义规则，它其实是满足的，它内部无法继续确保合理的填数具体是哪个组合。但是，我更建议大家在做题的时候，先确保其他数字的、关于前面介绍过的基础技巧都用完了，确实用无可用时，再来看这种结构。

循环态的用法并非想强调定义是如何的，而是希望各位看到它的时候能有个意识，认为它无法有结论，进而快速跳过此数，以节省做题时间。

## 笔记 ≠ 候选数 <a href="#notes-are-not-candidates" id="notes-are-not-candidates"></a>

在平时做题的时候，我们会从无到有标注笔记来辅助我们做题。通常意义上，区块我们是不会参与标记的，因为作用不大，而且会扰乱市面上众多应用对技巧计算的逻辑。

举个例子。我们拿这款产品举例，可以看到，我在题目里标注了一些笔记，其中包含一个数对和一个区块：

<figure><img src="/files/Zn9WnMMvFpluDOmQ8E4a" alt="" width="188"><figcaption><p>某款产品里标注笔记的画面</p></figcaption></figure>

可以看到，右上角 `b3` 被我们标注了 9 的区块。这是可以通过最直接的数字 9 的排除得到。但是，一些市面上的数独应用在计算提示的时候，会参考用户所标记的笔记。但用户的笔记总是不全的。什么意思呢？比如说 `r3c7` 这个单元格，很明显它还能填入数字 1、3、6，但我们因为区块而标注了数字 9。

在提示的计算时，要么应用会认为你的笔记不全而跳过它的计算，要么它会强行视为这个单元格只有候选数 9 而猜测这是唯一余数技巧。这显然是不对的。严格的笔记标注是需要复杂的推算的，而只给予小部分的区块就填写进去很多时候不仅带不来任何有意义的信息传递，而且还会扰乱应用，造成推算失败或失效。我们当然知道这个只是区块 9，但绝对意义上讲，区块 9 不应分散到两个单元格里标注其笔记。从机理上讲，它更像是需要我们对 `r3c78` 整体进行区块 9 的标注，而非对单元格的标注。只是单纯因为应用大多不支持直接将一堆单元格看成整体，所以只能这么标而已。

这是我想说的。标注笔记的目的在于辅助我们推理。如果它没有提供任何优质的推算提示和暗示，那么它就没有任何标注的意义；与此同时，笔记不等于候选数，候选数是严格按照唯一余数的操作对每个单元格都有完整、正确和严谨处理的，而笔记不是。倒不是说人总是会犯错，但大多数时候，我们并不需要给所有空格都标满全部可能性，这不仅对做题帮助不大，而且还增大了我们找技巧的复杂度和观察难度。如果不是非常困难的题目，一般我们都不建议全部都标上。


# 标准鱼

Normal Fish

有了前面的这么多内容作为铺垫，我们得以快速进入到新篇章里来。下面展示的是新的一类数独技巧：**鱼**（Fish）。

鱼是一个特别大的体系，所以我们会把这个内容拆为两部分介绍，先是简单的部分，后面才是更需要底层的部分。

鱼这个技巧在早期，沿用的是台湾对这个技巧的称呼：**链列**。现在逐渐使用鱼的称呼代替了这个叫法。


# 鱼的基本推理

Reasoning of Normal Fish

二阶鱼我们先来看鱼的基本推理过程。

## 二阶鱼（X-Wing） <a href="#x-wing" id="x-wing"></a>

<figure><img src="/files/xjmUQH29DKg5E0ZLDr6Y" alt="" width="375"><figcaption></figcaption></figure>

如图所示，我们可以看到，数字 6 在 `r1` 和 `r8` 里都只有同样两个列的地方填。

这说明什么呢？我们把四个单元格的坐标提出来：`r18c26`。那么，按照数独的最终填数过程，我们要保证同行列不能填重复的数字，所以两个 6 的分布只能是互不相干的两列上，那么就有这两种情况：

1. 要么左上角和右下角填 6：`r1c2` 和 `r8c6`；
2. 要么右上角和左下角填 6：`r1c6` 和 `r8c2`。

这里要补充说一下。因为 `r18` 都缺 6，所以最终 `r1` 要填一个 6 进去，而 `r8` 也得填一个，所以最终在这两行里必须是有两个 6 的填入的。所以，只可能是上面这两个情况，而不可能存在只填一个 6 或甚至 6 一个都不填的情况。

搞清楚这一点后，我们来看分布。如果我们是第一个情况，那么 `c2` 里填 6 的机会会落在 `r1c2` 上，而 `c6` 里填 6 的机会会落在 `r8c6` 上。而如果是第二个情况，`c2` 里填 6 的机会会落在 `r8c2` 上，而 `c6` 里填 6 的机会就会落在 `r1c6` 上。

这稍微有点绕，但是还是比较清晰的。因为填 6 的全局就只有这两种情况，而不论是哪种情况，`c2` 和 `c6` 都会出现 6 的填入。即使我们分不清楚具体 `r18c26` 里的 6 的具体分布，但这并不重要。我们只需要知道的是，`c2` 肯定有 6，`c6` 也肯定会有 6 就行了。

因为 `c2` 里必须有 6 填在 `r18c2` 的其一，所以 `c2` 的其他位置都没有任何可能（与其说是“可能”，还不如说是“机会”，没有任何机会）填入 6。所以，`c2` 的任何其他空格都可以删除候选数 6；而对于 `c6` 也是一样：`c6` 里填 6 的位置一定会落在 `r18c6` 的其一，所以别处都不能填。

所以，这个题的结论是 `{r37c6, r9c26} <> 6`。

我们把这个推理过程称为**二阶鱼**（X-Wing）。鱼的本质推理就是在假设某一个单一的数字在某几个行或列里的排列情况。

另外，因为鱼早期也叫链列，所以二阶鱼早期也叫**二链列**。

我们再来看一个例子，希望这一次你能自己推理它。

<figure><img src="/files/S8wVKuRwcDP42PQquNCc" alt="" width="375"><figcaption><p>二阶鱼 练习题</p></figcaption></figure>

稍微提示一下。刚才我们是横着看的，这回我们得竖着看。

## 三阶鱼（Swordfish） <a href="#swordfish" id="swordfish"></a>

刚才我们学习的是二阶鱼。鱼和数组一样，也有规格一说，所以二阶鱼指的是规格为 2 的鱼。下面我们来看，鱼在规格为 3 的时候，都长啥样。

<figure><img src="/files/hVZZDiF7tv8RO426FOGo" alt="" width="375"><figcaption><p>三阶鱼</p></figcaption></figure>

如图所示。我们可以看到，`r368` 三行里填入 4 的位置刚好在三个不同的列里。这一点和前面二阶鱼的效果一致。

按照数独规则，`r3` 要填一个 4，`r6` 也要填一个 4，而 `r8` 也得填一个 4，所以这三行一共要填进去三个数字 4。

由于我们刚才说过，整体来看，整个三行填 4 的机会全部分在三个不同的列 `c567` 里，所以不论你怎么去安排 4 的位置，为了确保数字 4 不会在行和列上重复出现，只能安排一个列里填一个 4。这样三个列都有 4，才不会造成冲突，也是唯一能让 4 正常填进去的情况。

既然每一列都要有个 4，那么 `c567` 的任何其他空格就没有机会填 4 了。所以：

* 对于 `c5`，结论就是 `r127c5 <> 4`；
* 对于 `c6`，结论则是 `r1c6 <> 4`；
* 对于 `c7`，结论就是 `r4c7 <> 4`。

我们把结论整合到一起，就是这个技巧的结论：`{r127c5, r1c6, r4c7} <> 4`。

我们把规格为 3 的鱼的推理过程，称为**三阶鱼**（Swordfish）。也叫**三链列**。英文名的直译是剑鱼。

现在我们来看另外一个例子，也是和前面一样，希望你自己推理。

<figure><img src="/files/6Tv0NH5dteLwCAwQ6RvH" alt="" width="375"><figcaption><p>三阶鱼 练习题</p></figcaption></figure>

## 四阶鱼（Jellyfish） <a href="#jellyfish" id="jellyfish"></a>

下面我们来看规格为 4 的情况。

<figure><img src="/files/fGyFbiYz6uThaOHkVWvS" alt="" width="375"><figcaption><p>四阶鱼</p></figcaption></figure>

这个题是故意构造的。因为平时做题压根就遇不到这种长得非常漂亮的结构。

如图所示。我们发现，数字 9 在四个列（注意这回是看列）里的所有可填位置只有 16 个。看起来很多，但是只看它们出现的行的话，其实可以很容易发现，这 16 个单元格只用到了四个不同的行：`r1247`。

让我们想一想，因为 `c2367` 里每一列都要出现一个 9，所以四个列一共要填进去 4 个 9。那么，让这 16 个位置合理分配 4 个 9 的位置摆放，以规避 9 在同行列上出现重复的话，是不是每一行安插一个 9 就行了？

所以，这一点和前面的推理过程完全一样。既然我们要让每一行填一个 9，那么 `r1247` 这四个行里填 9 的位置必然会在这 16 个单元格里来回变动，逃不出这 16 个格子。得到这个结论后，我们就可以得到结论了——这些行的其他任何空格都没有机会填 9，因为填 9 的机会，针对于这四行来说，一定落在前面说的这 16 个格子里。

所以，整合结论，我们就有了这个题的结论：`{r1c4569, r2c469, r4c19, r7c14569} <> 9`。我们把这个技巧称为**四阶鱼**（Jellyfish），早期也叫**四链列**。英文名直译的话是水母。

和前面一样，我们也再来看一个例子。希望这个例子自己推理。

<figure><img src="/files/JMWHJEKKWEXcwE9i4Xo1" alt="" width="375"><figcaption><p>四阶鱼 练习题</p></figcaption></figure>

这个题仍然是前面那个题，只是四阶鱼的结构它换了个数字。当然，结论肯定也就不一样了。

## 鱼的残缺态 <a href="#incomplete-state-of-fish" id="incomplete-state-of-fish"></a>

前面我们看到了若干个例子，我们不难整理出鱼的通用规则：

对于某一个数，去看这个数在若干个行（列）里的所有可填位置，是否恰好也都只出现在若干个列（行）之中。如果是的话，那么鱼就成立了，结论就是这若干个列（行）的其余空格里的这个候选数数字均可删除。

不过，这里有个小小的问题。

<figure><img src="/files/ln7JomRy6ZyS21mUaFtn" alt="" width="375"><figcaption><p>残缺鱼 例子</p></figcaption></figure>

比如这个例子。假设这个题的 `r5c1`、`r6c5` 和 `r7c7` 都是空格，且包含候选数 1 的话，那么这样的结构就刚好用满 9 个空格，便是所谓鱼的最完整的状态。

类似于这样，因为鱼的规格为 $$n$$ 的话，那么最完整的状态一定是 $$n^2$$ 个单元格。如果缺少任意的位置不可摆放的话，假如这样的鱼照样能成立（就像上面这样仍然不影响推理），那么我们就称这种鱼是**残缺**（Incomplete）的。

理论上来说，我们要保证鱼的成立，每一个行（列）肯定至少得有两个可用位置作排列。如果就剩一个位置了，那不就直接等于是之前的行列排除了吗？所以，每一行（列）里必须保证最少两个格，因此鱼在残缺的时候，最极限的状态是只用 $$2n$$ 个单元格，即一个鱼能够推理，需要用到的空格数量一定是介于 $$\[2n, n^2]$$ 这个区间的，其中 $$n = 2, 3, 4$$。

## 组合区块和二阶鱼

前面我们讲过组合区块的逻辑。可以从组合区块的推理逻辑里看出，它其实和二阶鱼的逻辑完全一样。从技巧分类上来说，组合区块其实是二阶鱼的子集：二阶鱼在使用的四个单元格刚好分布在两个宫里的时候，这种情况就被称为组合区块。


# 鳍鱼

Finned Fish

前面我们学到了鱼的基本推理逻辑。下面我们来看看，鱼的一个特殊的部件。

## 二阶鳍鱼（Finned X-Wing） <a href="#finned-x-wing" id="finned-x-wing"></a>

<figure><img src="/files/hbDj4HAQWO9FYqJPWYzV" alt="" width="375"><figcaption><p>二阶鳍鱼</p></figcaption></figure>

如图所示。我们发现，配色比二阶鱼多了一个蓝色。

这一次我们假设 `c67` 里填入的 7 的排列多出了一个单元格：`r1c6`，而它肯定会影响我们二阶鱼的成立。那么我们干脆把它“分离”出去。我们把它当成一个特殊的存在，假设它最终是不是正确的填数，然后看看结论是否有用。

* 如果 `r1c6 = 7`，则按照直观排除的效果，`r1c6` 所在的行、列、宫里的其他空格都不能填 7，删除这些位置的候选数 7；
* 如果 `r1c6 <> 7`，则盘面可以删去这个候选数 7，于是一个标准版的二阶鱼就形成了，删除的结论是 `r24` 的其他空格的候选数 7（推理过程略）。

很显然，这两个毫不相干的结论，是有交叉的部分的，那就是 `r2c45(7)`。第一种情况下，由于 `r1c6 = 7` 会影响到所在宫（即这里的 `b2`），所以 `r2c45 <> 7` 是这个情况下删数的一部分；而第二种情况下，由于鱼成立，所以删数是 `r24` 的别的 7，而 `r2c45` 也恰好位于 `r24` 里属于删除范围的一部分。

显然，`r1c6 = 7` 和 `r1c6 <> 7` 已经是全部的可能性。那么既然两边都能去掉 `r2c45 <> 7`，那么我们可以认为，这个删数结论就是正确的。所以这个题的结论就是 `r2c45 <> 7`。

我们把这个技巧称为**二阶鳍鱼**或**鳍二阶鱼**（Finned X-Wing），当然也可以叫**鳍二链列**，并把影响二阶鱼成立的蓝色数字 7（即图中的 `r1c6(7)`）称为**鱼鳍**（Fin），这样的鱼称为**鳍鱼**（Finned Fish），即带有鱼鳍的鱼。

## 三阶鳍鱼（Finned Swordfish） <a href="#finned-swordfish" id="finned-swordfish"></a>

<figure><img src="/files/JPvEkVaVVQlWjj9JycwQ" alt="" width="375"><figcaption><p>三阶鳍鱼</p></figcaption></figure>

如图所示。请观察 `r189` 这三行的数字 7。

我们将 `r1c6(7)` 当成鱼鳍，假设它的两种可能性：

* 如果 `r1c6 = 7`，则删除的是所在行、列、宫其他位置的 7；
* 如果 `r1c6 <> 7`，则标准的三阶鱼成立，删除 `c348` 其他位置的 7。

显然，和前面的题完全一样的是，可以删除的部分也刚好存在。这个题是 `r3c4(7)`。所以，`r3c4 <> 7` 是这个题的结论。

我们把这个结构称为**三阶鳍鱼**或**鳍三阶鱼**（Finned Swordfish），早期也叫**鳍三链列**。

## 四阶鳍鱼（Finned Jellyfish） <a href="#finned-jellyfish" id="finned-jellyfish"></a>

下面我们来看规格为 4 的情况。

<figure><img src="/files/MdSeY6m9Bb2de7jYu6my" alt="" width="375"><figcaption><p>四阶鳍鱼</p></figcaption></figure>

如图所示。我们把这个题里的 `r6c7(9)` 视为鱼鳍，假设它的两种情况：

* 如果 `r6c7 = 9`，则删除所在行、列、宫其他单元格里的候选数 9；
* 如果 `r6c7 <> 9`，则四阶鱼成立，删除 `r1489` 其他空格里的候选数 9。

可以看到，两种状态下，`r4c8(9)` 都是覆盖得到的部分，所以 `r4c8 <> 9` 是这个题的结论。

我们把这个结构称为**四阶鳍鱼**或**鳍四阶鱼**（Finned Jellyfish），早期也叫**鳍四链列**。

## 对鳍鱼的一些疑问 <a href="#questions-for-fins" id="questions-for-fins"></a>

### 问题 1：鳍鱼的形成似乎有些…… <a href="#i-wonder-how-a-finned-fish-can-be-formed" id="i-wonder-how-a-finned-fish-can-be-formed"></a>

可以从前面讲解的逻辑上看出，似乎删数的形成有些过于“草率”，它的形成有些摸不着头脑。就是说，我不知道鳍鱼是否存在一个通用的“公式”，我只要找到这个切入条件，鳍鱼的形成就可以自己判断了，而不是光看例子就看得懂，自己找的时候就不知道怎么去看。

我们要明白一个点。我们首先需要拿出鱼鳍来作为删数条件的判断，那么鱼鳍就必须有摆放上的要求。就是说，这个鱼鳍的位置是有讲究的，它肯定不能是任何一个位置上。

可以通过前面展示的例子里看出，它一定处于初始假设的行列上。就是说，它的位置，一定要影响鱼的形成。比如说一个鱼初始排列需要用 `r124` 三行，那么鱼鳍就必须在 `r124` 行上，而不能是比如说 `r9` 这些位置上。

其次，鱼鳍的两种状态要使得删数在取“交集”的时候能有删数，那么它的位置一定要和鱼本身的删除的部分有交集。这说明了鱼鳍的位置肯定也不能放在跟鱼本身没有任何关联的位置。

我们还是拿规格最小的二阶鳍鱼举例。

<figure><img src="/files/hbDj4HAQWO9FYqJPWYzV" alt="" width="375"><figcaption><p>还是前面那个二阶鳍鱼</p></figcaption></figure>

如图所示。这是刚才那个例子。我拿这个例子给各位解释我刚才说的第二点到底是什么意思。我们先忽略 `r1c6(7)` 的存在，这里是为了说明鱼的形成，所以暂时先不要它，当他不在盘面里。

由于要有删数，所以，7 的位置一定就不能距离四个绿色的 7（二阶鱼形成的这四个位置）过远。比如说，假设我在 `r7c6` 这个地方有一个候选数 7。我们把 `r7c6(7)` 视为鱼鳍的话，这个时候的假设就会成这样：

* 如果 `r7c6 = 7`，则 `r7c6` 所在行列宫其他单元格都不能是 7；
* 如果 `r7c6 <> 7`，则二阶鱼成立，删数按最开始 `r24` 其他空格删掉 7 即可。

显然，鱼鳍肯定是影响不到第二点（`r7c6 <> 7` 这种情况）的。那么主要改变的是第一点的逻辑。可是，我们要想在删数上取交集，而 `r7c6(7)` 是鱼鳍的话，这是不可能有交集的。因为根据第二点，删数的范围在 `r24` 上，但鱼鳍距离这两行实在是太远了。不论是 `r7c6` 的行也好，列也好，宫也好，都没有任何和 `r24` 上构成删数的交集部分。

我想说的就是这个意思。要想保证这个鱼鳍能够最终起效并造成有效删数，它势必需要跟鱼本身的结构有些许关系。那么你觉得这个关系是什么呢？

是的！只要让鱼鳍（配色为蓝色的位置）的出现位置跟鱼本身（配色为绿色的那些位置）的任意其中一个格子同宫即可。只要鱼鳍和鱼的某一个单元格同宫，那么这个鱼鳍就是有效的。

有这一点之后，我们回去看所有的例子。是不是就豁然开朗了？所有的三个例子，鱼鳍都和鱼的其中一个格子同一个宫。

### 问题 2：鱼鳍就只能有一个吗？ <a href="#is-the-number-of-fins-must-be-1" id="is-the-number-of-fins-must-be-1"></a>

有了前面问题的铺垫，那么这个问题就有答案了。

显然，鱼鳍在同一个题里不一定非得只有一个。

<figure><img src="/files/etpnD9dwDmTX6sDrMCcp" alt="" width="375"><figcaption><p>两个鱼鳍的二阶鳍鱼</p></figcaption></figure>

如图所示，这个题就有两个鱼鳍。

不过，两个鱼鳍怎么去推理呢？把这两个鱼鳍当成整体就行了。不过如果初学的话，分开讨论一次也是必不可少的，主要是练习这种列举情况的思维，避免遗漏：

* 如果鱼鳍都不是正确填数
* 如果鱼鳍至少有一个是正确的填数

这两个就是鱼鳍的全部情况。

> 这你要是还不能理解那就上数学式子呗。“都不是”就等价于 $$=0$$ 个位置填；那么他的相反情况就只能是 $$>0$$ 个位置填，也就是说至少有一处。
>
> 严谨一点来讲，$$=0$$ 的相反情况是 $$eq 0$$。不过，单元格数量不可能为负数，所以就不存在 $$<0$$ 的情况。

那么，直接假设一波：

* 如果鱼鳍都不是正确填数：
  * 此时鱼直接成立，按鱼的标准删数规则来删即可；
* 如果鱼鳍至少有一个是正确的填数：
  * 要么 `r5c8 = 1`，则删的是这个单元格所在行、列、宫的其他空格的候选数 1；
  * 要么 `r6c8 = 1`，则删的是这个单元格所在行、列、宫的其他空格的候选数 1。

所以这回就从两个情况变为了三个情况了。不过，因为鱼鳍都在同一个宫里，取了交集之后删数似乎并不受影响。因此，删数就跟其实 `r56c8(1)` 只有其中一处有鱼鳍的情况，所造成的删数其实是一样的。

所以，如果一个鱼用到了多个鱼鳍，那么只要鱼鳍能在同一个宫里，并且只要鱼鳍也都和鱼的其中某一个格子同宫（之前问题 1 里的结论），这样的鱼就是合理的。

另外，看起来似乎鱼鳍最多就只能两个。因为再多就容不下同一个宫了。实际上不是的。鱼鳍最多可以有 4 个。下面就是一则有 4 个鱼鳍的题目：

<figure><img src="/files/suRwTcUhOuEMibw73n7b" alt="" width="375"><figcaption><p>有四个鱼鳍的三阶鳍鱼</p></figcaption></figure>

如图所示。这是一个三阶鳍鱼，并有四个鱼鳍 `r23c89(1)` 。

不过，推理我就省略了。这个的推理过程和前面的也都完全一样。

### 问题 3：有些别扭的鳍鱼 <a href="#a-weird-finned-fish" id="a-weird-finned-fish"></a>

我们再来看一则例子。

<figure><img src="/files/XoLcRkS5hGy6MxTS9t3A" alt="" width="375"><figcaption><p>这都啥玩意儿啊？</p></figcaption></figure>

如图所示。和前面的鱼鳍的推理方式完全一样地思考这个题，就会有点奇怪：

* 如果 `r1c2 = 5`，则所在的行、列、宫的其他空格都不能填入 5，删除它们；
* 如果 `r1c2 <> 5`，则……这应该叫什么，三阶鱼？它成立……等会，它真的成立吗？

问题肯定出现在第二点上。如果我们忽略掉 `r1c2(5)`，视它不存在的话，那么这个鱼用到的格子的分布是：

* `r1` 上有 `r1c89`；
* `r4` 上有 `r4c19`；
* `r8` 上有 `r8c89`。

这甚是奇怪。当鱼鳍不存在的时候，单看 `r18`，二阶鱼似乎已经成立，而根本轮不到三阶鱼什么事情。实际上也确实如此。那么这个删数看起来就会显得非常奇怪。这二阶鱼怎么可能删得到 `r23c1(5)`？

这个问题，你需要使用类似之前数组显隐性互补之后会出现大数组里包含小数组的那种思维去理解它。虽然二阶鱼已然成立，但是我们这里算上 `r4` 也未尝不可。大不了这个时候（鱼鳍不存在的时候），`r4c1` 就是 5 就行了。鱼的排列假设是看的行，然后发现它分布在几个不同的列里，然后发现列上必有一处填入。而当这个鱼成立时，`r4` 的两处，会使得 `r4` 真正意义上只有 `r4c1 = 5`。

之所以把这个结构给算上，还是因为鱼鳍的位置稍显特殊一些。我们刚才说，鱼鳍必须要在和鱼的某一个用到的单元格同一个宫。但这个题似乎并没有满足这一点。但是你仔细看看，它真的不满足吗？

是的。这个鱼本身就是残缺的。它缺失了一个重要的单元格，是 `r1c1(5)`。这个格子如果被我们补上，那么这个鱼的推理可能就不会那么难以理解。而这个鱼鳍和鱼的某一个格子同宫，在这个例子里是隐晦了一些：鱼鳍其实是跟不存在的“假肢”位于同一个宫里。

对于这种跟假肢位于同一个宫的鱼鳍，在鱼里面也是广泛存在的。这点和之前学到的数组互补之后会被小数组所代替稍微不同。数组那个可以被代替，而且是无条件代替掉，因为数组没有鱼鳍一说。

好了。至此我们就把鱼鳍的基本概念给各位说明白了。下一节我们将继续针对鱼鳍，给各位带来更加奇葩的用法。


# 退化鱼

Sashimi Fish

在鳍鱼的最后，我们列出了一种情况，就是大鱼里有小鱼的情况。鱼鳍的存在，才会让这样的结构能够稳定存在。

下面我们来看另外一种鱼鳍存在，鱼才会成立的情况。

## 二阶退化鱼（Sashimi X-Wing） <a href="#sashimi-x-wing" id="sashimi-x-wing"></a>

<figure><img src="/files/oLKQU6d2vw00RCNGBD36" alt="" width="375"><figcaption><p>二阶退化鱼</p></figcaption></figure>

如图所示。我们先看这个鱼，显然这个鱼长相就非常奇特——它就用了三个单元格。

如果我们补上 `r6c9(8)`，这个鱼就是一个很普通的二阶鳍鱼。但是看起来似乎这个删数跟它有没有，没有任何关系。

当鱼鳍不存在的时候，鱼只有三个单元格。我们只看的是 `r69` 里数字 8 的填数情况，而这次，`r6` 只有一个单元格可填了，所以 `r6` 直接会把数字填到 `r6c2` 上，然后 `r9c9` 因为 `r6c2` 填入之后直接也能出数。

于是，整个鱼由于鱼鳍的缺失而直接散架。但是，我们不难发现的是，由于 `r6c2` 和 `r9c9` 的填数，一个在 `c2` 一个在 `c9`。所以这点和鱼的性质完全一样：仍然能保证两列都会出现 8 的填数。

所以，这种鱼的情况从之前的排列直接简化成了如下两个情况：

* 如果 `r6c7 = 8`，则删除 `r6c7` 所在行列宫其他位置上的候选数 8；
* 如果 `r6c7 <> 8`，则鱼直接瓦解，可直接得到 `r6c2` 和 `r9c9` 同时填 8，仍然可保证 `c29` 的鱼的规则删除候选数 8。

于是，`r5c9 <> 8` 仍然可以得到。

这个结构我们称为**二阶退化鱼**或**退化二阶鱼**（Sashimi X-Wing）。早期也叫**退化二链列**。

我知道你肯定没怎么看明白。一来是结构非常不优雅，二来是云里雾里的内容很难知道这种结构为什么就成立了。这个我们先放一边。我先把所有例子都给你讲完，然后再来说为什么这样的结构始终成立。

哦对，我再给你看一则例子。这个例子可以自己看一下。鱼鳍有两个就意味着我们直接合并讨论就行。其他的逻辑和前面叙述的完全一样。

<figure><img src="/files/wz2CE84JMzXvgA1hRXY4" alt="" width="375"><figcaption><p>两个鱼鳍的二阶退化鱼</p></figcaption></figure>

## 三阶退化鱼（Sashimi Swordfish） <a href="#sashimi-swordfish" id="sashimi-swordfish"></a>

<figure><img src="/files/ejXqyPv8Dyw2PmAR76kZ" alt="" width="375"><figcaption><p>三阶退化鱼</p></figcaption></figure>

如图所示，我们仍旧使用鱼鳍的视角讨论它的两种状态：

* 如果 `r3c7 = 7`，则删除所在行列宫其他位置的候选数 7；
* 如果 `r3c7 <> 7`，则剩余的 5 个鱼使用的单元格会直接因为 `r3` 而瓦解，并顺次得到 `r3c3`、`r5c4` 和 `r9c9` 填 7。与此同时，也保证了 `c349` 各列都出现一个 7，于是鱼的删数规则仍然成立，删除 `c349` 其余位置的候选数 7。

然后我们按交集的规则，仍然可以得到 `r2c9 <> 7` 的结论。

我们把这个称为**三阶退化鱼**或**退化三阶鱼**（Sashimi Swordfish）。早期也叫**退化三链列**。

下面我们再来看一则例子。

<figure><img src="/files/2HkeCIQcRhe3bGDBhLd4" alt="" width="375"><figcaption><p>三阶退化鱼，另外一个例子</p></figcaption></figure>

如图所示。这个例子我得说一下，因为有点难理解。

和前面假设的方式一样，不过这一次我们要把两个鱼鳍当成整体进行讨论：

* 如果鱼鳍都不是正确填数，则剩下的 5 个单元格由于 `r6` 只剩下一个位置可填，导致结构瓦解，并依次得到 `r6c6`、`r4c1` 和 `r3c7` 分别填上 4 的结果。并因为这种填法，`c167` 都会出现一个 4，所以 `c167` 三列里的其他单元格的候选数 4 均可删除；
* 如果鱼鳍里至少有一个是正确的填数，则：
  * 如果是 `r4c9 = 4`，则删除 `r4c9` 所在的行列宫其余位置的候选数 4；
  * 如果是 `r6c9 = 4`，则删除 `r6c9` 所在的行列宫其余位置的候选数 4。

当我们按照这个规则讨论之后，一共可以列举出三种填法，而三种填法的交集是 `r5c7(4)`。因此，`r5c7 <> 4` 是这个题的结论。

## 四阶退化鱼（Sashimi Jellyfish） <a href="#sashimi-jellyfish" id="sashimi-jellyfish"></a>

<figure><img src="/files/dgPsTaebxopuMgvo6gsU" alt="" width="375"><figcaption><p>四阶退化鱼</p></figcaption></figure>

如图所示，这个例子也是如此讨论。讨论鱼鳍的两种情况，这一点和前面一样，因此这个例子就不解释了，只是规格稍微大一些。

这个我们叫做**四阶退化鱼**或**退化四阶鱼**（Sashimi Jellyfish），早期也叫**退化四链列**。

## 说说为什么这种结构能奏效 <a href="#questions-about-why-sashimi-fishes-are-valid" id="questions-about-why-sashimi-fishes-are-valid"></a>

我们把这种结构称为**退化鱼**（Sashimi Fish）。所谓退化鱼的本质逻辑就是去掉鱼鳍之后，某个行列会直接瓦解成为单一的填数（行列排除），进而牵一发动全身。

### 问题 1：为什么鱼直接瓦解仍然能让鱼能具有合理的删数？ <a href="#question-1" id="question-1"></a>

先来说第一个问题。这个问题解释起来比较简单。

要说这个问题，我们需要回忆一下鱼的推理过程。鱼的推理过程是为了保证一个 $$n$$ 行（列）的某一个候选数刚好只出现在 $$n$$ 个不同的列（行）里。由于我们为了保证数字在排列的时候能够规避产生重复的问题，而行列的数量一致，那么我们只好每一个列（行）都分配一个这个数字的填写，这样互相不冲突。而正是因为这样的摆放是唯一可以规避重复的方式，而行列数量一致，导致了它不会有列（行）里完全不出现这个数字的问题。所以，所有这些列（行）的其他单元格都没有可能填入这个数。

而这种鱼的类型呢？不管它缺不缺单元格，你就说满不满足吧。你可以把结构代入这个说法，你可以发现它仍然是满足的。尤其是最开始这一句。它缺格子又不是多格子，所以缺少的格子并不会导致分布的行列超出去。这是它的本质原因。

所以，大大方方用就行了。你是第一次了解这一点，所以看起来略显别扭。但是实际上并不影响。

### 问题 2：有些单元格似乎在推理的过程之中就压根没用过 <a href="#question-2" id="question-2"></a>

<figure><img src="/files/oLKQU6d2vw00RCNGBD36" alt="" width="375"><figcaption><p>还是刚才的二阶退化鱼</p></figcaption></figure>

这个问题需要解释一下。如图所示，这还是刚才的那个二阶鱼的例子。

在完整的推理过程之中，要么鱼鳍 `r6c7` 填 8，要么就是 `r6c2` 和 `r9c9` 填 8。整个推理过程自始至终都没用到左下角的 `r9c2(8)`。

这不免会让人引起疑心：这个 `r9c2(8)` 怕不是个充数的。它存在的意义是什么？我们可否因为它用不上而删除它？

这个问题的答案肯定是否定的。它有用，而且不能删除。可它用在哪里了呢？这里就要说到退化鱼一个不太优雅的点了：它需要内部列举一下填数才能知道它存在的意义。

我们倘使 `r9c2 = 8` 看看到底会出什么效果。我们知道，退化鱼有一个特征：鱼鳍所在的这个行列上，去掉鱼鳍会因为只剩下一个位置而直接造成瓦解（那肯定得是鱼鳍所在的这个行列上，因为不在鱼鳍的行列上只剩下一个位置不就直接成行列排除了么）。而这个退化鱼的特征我们现在要用上去了。因为 `r9c2 = 8`，所以对于可导致瓦解的 `r6` 而言，此时鱼鳍这个位置会被迫填入 8。是的，你没有用到的这个位置，它其实是鱼鳍填入的情况，才会遇到的。而这一点，它并未体现在我们前文的推理过程之中，因为它不重要。

<figure><img src="/files/ejXqyPv8Dyw2PmAR76kZ" alt="" width="375"><figcaption><p>还是刚才的三阶退化鱼的例子</p></figcaption></figure>

再来看这个例子。这个例子里，要假设填出数字的位置，然后还有鱼鳍，实际上还有两处单元格没用到，即这里的 `r5c3` 和 `r9c4`。

实际上你假设其中任意一个填入，最终都会落到鱼鳍 `r3c8 = 7` 的填法结果上。

所以，这个问题的结果已经显而易见了：没用到的位置其实是和鱼鳍绑定起来的同一个填数情况。

### 问题 3：似乎鱼鳍仍然没有跟鱼的本体的某一个格处于同一个宫 <a href="#question-3" id="question-3"></a>

这个前面解释过了。我还是说明一下。退化鱼的特征是，去掉鱼鳍后，鱼的某一个行列上会直接只剩下一处单元格可填，进而造成鱼的结构直接全盘瓦解。所以很明显我们知道的是，退化鱼本质是残缺鱼的一种特殊状态。

既然是残缺的，就有可能会出现和鱼鳍同宫的那个（或那些）位置残缺的状况。此时你需要把它给补回去才能勉强看明白。这是这种残缺鱼不太能让人理解的一个地方。

不过，经过前面细致的说明之后，我们不难发现，这种补充是随时可用的。因为残缺鱼本身不影响鱼形成的推理过程，所以你完全可以补回去让他看起来更好看点，理解也更好理解一些，所以在看这种鱼的时候建议你补一下空格，然后再去理解。

## 退化鱼的精确定义 <a href="#rigor-definition-of-sashimi-fish" id="rigor-definition-of-sashimi-fish"></a>

终于来到退化鱼的最后一个需要说明的知识点了。在之前鳍鱼的那一节，最后我们留了一个题，给大家介绍了一种大鱼包含小鱼的这种特殊状态的鳍鱼，而似乎它看起来有些类似退化鱼的思维。

现在再给各位看一个例子。这个例子是退化鱼，但是它不能做到结构完整的瓦解：

<figure><img src="/files/T7L8EO9Pgk0pqvUe3wIU" alt="" width="375"><figcaption><p>退化鱼，但不是整个鱼完全瓦解</p></figcaption></figure>

我们可以看到，假设鱼鳍 `r9c3 <> 8` 的时候，我们虽然可以得到 `r9c9 = 8` 的结果，但是得到之后我们通过排除只能得到 `r16c9 <> 8` 的结论。看起来似乎余下的部分并没有瓦解。

有人说 `b6` 里的 8 只有 `r4c8` 可以填了。这是不对的。因为它只是这个题满足的巧合。实际上在其他的题里，没用到的 `r5c789` 里可能会有 8 的存在，此时排除掉之后 8 仍然得不到出数。所以你只能把它当成巧合。

那么，这不能瓦解怎么又叫退化鱼了呢？

我还是把前一节的那个题拿过来给大家作对比。

<figure><img src="/files/XoLcRkS5hGy6MxTS9t3A" alt="" width="375"><figcaption><p>之前那个鳍鱼的例子</p></figcaption></figure>

对比了之后我们不难发现，这两个题还是有本质区别的：鳍鱼的这个例子，鱼鳍去掉后，`r4c1 = 5` 的结论是后出的。换言之，鱼鳍去掉后，鱼鳍的所在行（即这里的 `r1`）并没有受到影响，它还是两个候选数的分布。

但是前面的那个退化鱼的例子里，鱼鳍去掉后，鱼鳍的所在行只剩下了 `r9c9` 这一处可以填。

所以，退化鱼的精确的定义是：**鱼鳍在去掉后，鱼鳍的所在行列上（假设的那个行列）只能有一处可放的位置。如果满足这一点的带有鱼鳍的鱼，我们把它叫退化鱼；反之，它就只能当成鳍鱼来看待**。


# 孪生鱼

Sashimi Fish

前面我们学到了鱼鳍的基本用法，是用来假设鱼鳍自身的填入和不填的两种状态，从而影响鱼的推断，得到删数的一种特殊用法。

但是，有些时候，鱼鳍的存在可以使得鱼本身会具有一些特殊的特征，例如一连存在两个鱼，只有鱼鳍不一样的特殊情况。

## 二阶孪生鱼（Siamese X-Wing） <a href="#siamese-x-wing" id="siamese-x-wing"></a>

<figure><img src="/files/8YAvegb71wjFknf3uqB3" alt="" width="375"><figcaption><p>二阶孪生鱼</p></figcaption></figure>

如图所示。你肯定在之前的文章里发现过，一些题的二阶退化鱼是比较特殊的，就像是图上这样，它其实是两个鱼同时长在了一起：

<figure><img src="/files/6GrWhEKxPFQIE47R4EdW" alt=""><figcaption><p>拆开看的两条二阶退化鱼</p></figcaption></figure>

可以看到，左图和右图各是一个二阶退化鱼，只是它们的鱼鳍不同。不同的点是，其中一个鱼的鱼鳍，在另一边变为了鱼的一部分；而一边的鱼的一部分在另一边就改成了鱼鳍：它俩互换了。

这个神奇的现象在鱼里也是广泛存在的。我们就把两个鱼绝大部分用相同的单元格，而只有一小部分会和鱼鳍互换的这种特殊鱼的状态称为**孪生鱼**（Siamese Fish）。

> 孪生一词来源于暹罗猫的暹罗（是一个地名）。相传几百年前这个地方诞生双胞胎的概率比其他地方都大，因此出名了。现如今，暹罗也会时不时用作术语，表示这种孪生的状态。例如计算机里的 siamese network（孪生网络）。

所以，孪生鱼其实并不算是一种数独技巧。它更像是归并了两条只有鱼鳍不同的鱼，并且鱼鳍会变为另一边的鱼的一部分，这样的一种特殊状态。

下面我们再来看一些例子。

## 三阶孪生鱼（Siamese Swordfish） <a href="#siamese-swordfish" id="siamese-swordfish"></a>

<figure><img src="/files/1cobsUsouyQ00yvd1j2q" alt="" width="375"><figcaption><p>三阶孪生鱼</p></figcaption></figure>

如图所示。它是如下两条鱼的合并。

<figure><img src="/files/GEJzCTMbNwU6oieJeC4q" alt=""><figcaption><p>拆开看的两条三阶退化鱼</p></figcaption></figure>

## 四阶孪生鱼（Siamese Jellyfish） <a href="#siamese-jellyfish" id="siamese-jellyfish"></a>

<figure><img src="/files/Mnx4clpfvLU2czcCzJmZ" alt="" width="375"><figcaption><p>四阶孪生鱼</p></figcaption></figure>

如图所示。它是如下两条鱼的合并。

<figure><img src="/files/AptyndZaRLJG4b0JWKt8" alt=""><figcaption><p>拆开看的两条四阶退化鱼</p></figcaption></figure>

## 孪生鱼的类型 <a href="#types-of-siamese-fish" id="types-of-siamese-fish"></a>

在上面这一个例子里，我们发现到它和前面两则例子里的不同之处。当它拆分开之后，左图的这个是一个四阶退化鱼，而右图这个是一个四阶鳍鱼（因为 `r4` 里鱼鳍扣除后，还有两处可以填 9 的位置）。

所以，孪生鱼在定义上并未严格对是否是退化鱼，或者是否是鳍鱼有限制。实际上，孪生鱼会有三种归并的状态：

* 两个鳍鱼
* 两个退化鱼
* 一个鳍鱼和一个退化鱼

你能猜到它们的名字吗？答案公布：

* **孪生鳍鱼**（Siamese Finned Fish）：两个鳍鱼
* **孪生退化鱼**（Siamese Sashimi Fish）：两个退化鱼 或 一个鳍鱼和一个退化鱼

前面的三个例子，前两个是孪生退化鱼，最后一个也是，不过它是鳍鱼和退化鱼的合并。下面我们来看一个孪生鳍鱼的例子。

<figure><img src="/files/BBq7uLQjL30A92fm14J6" alt="" width="375"><figcaption><p>四阶孪生鳍鱼</p></figcaption></figure>

这个例子我就不展开成两个了。我相信你看过了前面三个例子后，这个例子应该看得懂。

再来看一个孪生退化鱼。不过这个有三个鱼鳍。

<figure><img src="/files/ZRhXZ5KFcyhteBLT6Qt7" alt="" width="375"><figcaption><p>三个鱼鳍的孪生退化鱼</p></figcaption></figure>

最后看一个有四个鱼鳍的四阶孪生退化鱼，也是鳍鱼和退化鱼合并的。

<figure><img src="/files/EqdDyZTzaiwnZolYdAB0" alt="" width="375"><figcaption><p>四阶孪生退化鱼</p></figcaption></figure>


# 鱼的直观和互补性

Direct View of Fish & Law of Complement of Fish

这一部分的内容不打算讲解技巧，主要还是理论知识。

可能你在学习鱼的时候发现它和数组其实是有一定的关联的。哪怕你看不出具体的关系，但是起码你会觉得这两个东西有一些不好描述清楚的细节是差不多的。比如说，鱼似乎在讲解的时候也就到 4 阶的状态。为什么鱼也不讲 5 阶及以上的规格？难不成鱼也有互补？

答案是肯定的。不过，在讲解互补之前，我们需要先给各位讲解一下鱼的直观视角。所谓鱼的直观视角，就是说，鱼可以在不标候选数的情况下，通过直观的方式就可以找出来。虽然它的复杂度仍然很大，但它起码提供了一种不标候选数就可以看到鱼的一种“渠道”。下面我们来说说这个问题。

## 鱼的直观 <a href="#direct-view-of-fish" id="direct-view-of-fish"></a>

为了确保下面的内容能更加贴合直观视角，我们暂时在这一讲里把候选数隐去。

<figure><img src="/files/1XzKVi7hgG1wtQrqhNJr" alt="" width="375"><figcaption><p>直观例子</p></figcaption></figure>

例如这个题。我们要找出鱼，我们需要进行如下的操作。我先不解释，然后等我们按照这个逻辑找到之后，再去讲解它的底层原理：

1. 针对于某一个数字（假设我们用字母 $$a$$ 来表示）而言，将盘面里所有提示数和填入数划分为两类，一类是就等于 $$a$$ 的数字，一类是不等于 $$a$$ 的数字（不等于 $$a$$ 的数字的格子可以是提示数和填入数不等于 $$a$$，也可以是空格，但空格里不含候选数 $$a$$）；
2. 从不是 $$a$$ 的数字里选取一些出来，使得它们的摆放形式能够形成一个 $$m \times n$$ 的矩形形态。其中 $$m$$ 和 $$n$$ 为矩形的长和宽（谁是谁都不重要，只是个字母代号），它们之间没有关系，可以相等也可以不相等。并且，找出的这个矩形，它们涉及的所有行列上，都不能有等于 $$a$$ 的格子；
3. 数一下全盘等于 $$a$$ 的单元格的数量。假设把个数记为 $$p$$；
4. 如果 $$m + n + p = 9$$，则鱼才是成立的（或者说这个盘面里有一个鱼，跟这个找到的结构有关系），其删数为这个矩形涉及的全部行列交叉排除后，其余尚未用到的空格里，包含候选数 $$a$$ 的全部格子。

好。下面我们来按照这个流程解释一遍。因为我知道这个题的答案，所以不妨就不拖延时间了。我就拿有鱼的这个数给大家演示一下，即数字 5。

我们先找出盘面里全部的数字 5 的提示数和填入数。似乎就只有 `r4c8` 是，其他单元格都不是，所以就这一个。与此同时我们也就得到了 $$p = 1$$。

接着，我们要在盘面里找出一个矩形，矩形用到的数都不能是 5 的格子，还不能和这个 `r4c8` 同在一个行和列上。注意，这个只有行列的限制，宫内是 OK 的。

那么，我们这么找。

<figure><img src="/files/Fz8yNUbNGhM9KRjZj2jI" alt="" width="375"><figcaption><p>直观视角</p></figcaption></figure>

蓝色的是等于 5 的部分，而绿色的是我们这个找出来的矩形。找出来的矩形一共用到 16 个单元格，且全部都不等于 5。并且，这些格子都不和 `r4c8` 同在一个行和列上。这里强调一遍是为了确保我们严格按照规定来走。

由于矩形的长宽都是 4，所以 $$m = n = 4$$。我们把式子代入，可得 $$m + n + p = 4 + 4 + 1 = 9$$。显然，式子是满足等于 9 的结果的。所以，这个结构是正确的，这也意味着鱼是存在的。

What？这就结束了？是的。我们找出的结构有效，意味着删数一定在矩形格子所在的所有行列都涉及不到的地方。于是，所有图中红色的候选数 5（表示的是这些格子都有候选数 5，也满足这种结构的删数规则的位置）均可删数。

那么，鱼究竟在哪里呢？如图所示。

<figure><img src="/files/Go96pdHEtRNXfU6F3JKw" alt="" width="375"><figcaption><p>真实的鱼的位置</p></figcaption></figure>

这是一个四阶鱼。

## 解释下奏效的原理 <a href="#explanation-of-why-this-view-is-valid" id="explanation-of-why-this-view-is-valid"></a>

请各位对比这两个视角，不知道你能发现到什么端倪。

<figure><img src="/files/hRQxUx8avCnyzdLAbulJ" alt=""><figcaption><p>两种视角</p></figcaption></figure>

左图是这个题的直观视角（我还是把候选数打开了）。右图是鱼的视角。

在仔细观察两边的视角后，不难发现如下的一些内容：

1. 找到的矩形，其实所在的行一定是右图里鱼用到的这些行；
2. 找到的矩形的单元格，没有任何一个格子被右边的鱼的视角里用到；反倒是刨除掉这些格子外，这些行里剩下的空格全部被用到了；
3. 等于 5 的格子（这图里的 `r4c8`）起到的是对这些行上可填位置的“排除”效果；
4. 删数虽然跟矩形行列无关，但因为第 2 点，似乎又确实有所关联。

诸如此类的发现，印证着这个视角肯定跟鱼有所联系。

首先，矩形的位置对于鱼整体的摆放位置而言，就是占位的作用。因为它们都不等于 5，所以放在这些地方，起到的是目标的鱼结构不会用它们。而之所以找完整的矩形，主要原因还是为了去卡鱼的规格。

比如这个题，鱼是一个 4 阶的情况，那么一整行里能用到鱼身上的格子就只能有 4 个单元格。刨去 `r4c8` 对所有行列作排除的通用去除效果，还剩下 8 个单元格；而找出的矩形一定都不等于 5，规格 4 × 4 的形式也会导致排除掉 8 个单元格的其中 4 个摆放位置。因为矩形的缘故，每一个鱼所用到的行，同样的这几个列都会被排除掉。这就是为什么找的是矩形的原因。

这样下来就只有 $$9 - 1 - 4 = 4$$ 个单元格了。而你对比一下前面描述的那个三个字母求和等于 9 的公式：

$$
m + n + p = 9
$$

其实不难发现，它其实就是这个式子然后移了下项。这就是为什么，这个找法能够奏效的本质原因。

另外，直观视角的好处在于，因为你每次只需要去看一个数（鱼只跟一个数有关系），所以整体只需要看这个盘面 9 次就可以把所有数字全部看完，并确定里面哪些数字有鱼，哪些没有。

## 鳍鱼和退化鱼的直观视角 <a href="#what-about-finned-and-sashimi-fish" id="what-about-finned-and-sashimi-fish"></a>

既然都说完了没有鱼鳍的鱼的直观，那么鳍鱼和退化鱼自然就不能漏掉。而孪生鱼其实等于两个带有鱼鳍的鱼，所以讲完这个之后，孪生鱼其实找法就出来了，没有必要单独给孪生鱼开个篇目讲直观视角，也没有多大的必要。不过，鳍鱼和退化鱼，虽然推理过程一个稍微好理解一些，一个稍微难一些，但是直观视角里，它们用到的规则是完全一样的。所以你可以用同一套逻辑去同时找鳍鱼和退化鱼。

其实，鳍鱼和退化鱼的直观只需要改变前面描述的规则里的其中一点，就是允许找出的矩形里有含候选数 $$a$$ 的空格即可：

从不是 $$a$$ 的数字里选取一些出来（同时也可以选取 1 - 4 个含有候选数 $$a$$ 的空格），使得它们的摆放形式能够形成一个 $$m \times n$$ 的矩形形态。其中 $$m$$ 和 $$n$$ 为矩形的长和宽（谁是谁都不重要，只是个字母代号），它们之间没有关系，可以相等也可以不相等。并且，找出的这个矩形，它们涉及的所有行列上，都不能有等于 $$a$$ 的格子。

后面的规格完全一样，计算 $$m + n + p = 9$$ 等式是否成立。如果成立的话，那么鳍鱼或退化鱼就成立了。只不过这次，因为我们补充了 1 - 4 个候选数 $$a$$ 的格子算在了矩形里去，所以当它成立时，我们要把它当成鱼鳍来看待。这里的鱼鳍是真正意义上的鱼鳍，按鱼鳍的规则删数。

鉴于删数这一步比较抽象，我们先来看一个例子。

<figure><img src="/files/9ZUY54M9J10sUyFQukaj" alt="" width="375"><figcaption><p>三阶鳍鱼的直观视角</p></figcaption></figure>

如图所示。这次我们看数字 2。数字 2 全盘里一共有 3 个，圈出来，并且得到 $$p = 3$$。

然后，确定矩形的位置。矩形是要求所用到的行列不能有 2 的提示数和填入数的，所以我们找到的矩形要格外小心一些。图中的这个是满足的。我们找到了矩形是 3 × 3 的，所以也就得到了 $$m = n = 3$$ 的结果。唯一和前面不同的地方是，我们允许 `r2c4` 是空格且含有候选数 2。这一点在找没有鱼鳍的鱼的时候，是不允许这么做的。现在允许鱼鳍存在，所以允许这样的单元格存在。

计算一下式子 $$m + n + p = 3 + 3 + 3 = 9$$，似乎是成立的。所以，这样的鱼是成立的。下面说下这个删数是怎么来的。

因为我们要把这里的 `r2c4(2)` 当成鱼鳍，所以我们需要讨论它的两种状态：

* 如果 `r2c4 = 2`，则 `r2c4` 所在的行列宫其他单元格都不能填 2；
* 如果 `r2c4 <> 2`，则三阶鱼成立，删数就是按前面取出矩形行列覆盖不到的位置直接删候选数 2 即可。

当我们将两种情况联立起来取出交集时，我们可以发现，此时能满足的位置仅有 `r13c5(2)`。所以，删数的结论就是 `r13c5 <> 2` 了。

那么，这一次这个鱼存在在哪里呢？

<figure><img src="/files/1JywctjPwnIVGNftmvPJ" alt="" width="375"><figcaption><p>三阶鳍鱼的实际位置</p></figcaption></figure>

如图所示。和前面完全一样的是，我们直接把所在行当成鱼用到的行，就行了。其他的完全不动。唯一的点是，因为刚才 `r2c4` 这个地方被我们当成鱼鳍了，所以转换成鱼的视角后，这里仍然是鱼鳍。

## $$m \neq n$$ 的情况 <a href="#case-when-m-is-not-equal-to-n" id="case-when-m-is-not-equal-to-n"></a>

前面的例子里我们解释了两个直观视角，但是非常奇怪的是，这两个例子的 $$m$$ 都和 $$n$$ 是一样的。但是在前面的描述里，我确实说了一点，实际上 $$m \neq n$$ 也是可以的，实际上两个数是没有什么大小关系的啊。

那么例子呢？下面我们就来看一个不一样的。

<figure><img src="/files/yZ8aGYmpHif4U9rEvRX9" alt="" width="375"><figcaption><p>m = 3、n = 4</p></figcaption></figure>

如图所示。这个题里的式子是 $$m + n + p = 3 + 4 + 2 = 9$$。它的鱼的长相是这样的：

<figure><img src="/files/Z10ElTPUhsOJaojLNHRF" alt="" width="375"><figcaption><p>实际的位置</p></figcaption></figure>

可以看出。虽然 $$m \neq n$$，但是鱼的视角似乎也没看出什么特殊之处。看起来它们之间的关系并不是一个特殊的用法。

……是吗？

## 鱼的互补性 <a href="#law-of-complement-of-fish" id="law-of-complement-of-fish"></a>

在讲完了鱼的直观视角后，下面我们来看看鱼的互补。是的，鱼是有互补的。这一点之前也一直没有说，有个最根本的原因，是因为它的证明（或者说理论依据）需要依赖于鱼的直观视角。如果你掌握了直观视角为什么奏效，那么你就肯定知道，鱼为什么会有互补了。

因为不管是退化鱼还是鳍鱼，还是没有鱼鳍的普通鱼，鱼都是有直观视角的。所以，我们完全可以拿之前的直观视角直接统一作说明。

先来一个普通鱼。

<figure><img src="/files/Makb1P9o87HMOXhviEtD" alt="" width="375"><figcaption><p>用三阶鱼讲互补性</p></figcaption></figure>

这个是一个很普通的三阶鱼结构，没有鱼鳍，删数也非常容易理解。要找出这个鱼的直观视角，其实只需要我们反推即可，不用我们从头开始看。因为刚才我们说，直观视角的本质是找矩形，矩形刚好是用来排除掉鱼的视角里的使用格的，所以它的直观视角非常容易就可以看出来：

<figure><img src="/files/51NmVpMSPmfIM2xSkZCL" alt="" width="375"><figcaption><p>前面这个三阶鱼的直观视角</p></figcaption></figure>

这是刚才那个鱼的直观视角。可以看出还是比较好看到的。因为直接在三个行里找一个矩形就行。而且我们都知道是三阶鱼了，所以只需要保证找出来的矩形的行数是 3 就行。

……但是！我们之前讲解的所有例子，让我们通过直观视角找鱼的实际位置的时候，我们始终都是按行来取的。这次，我们用列来看看？

看看这个矩形，它用到的列是 `c149`。我们按照等同的逻辑，只是这一次我们去矩形的列上看看能看出来什么。

嘿，还真有一个鱼：

<figure><img src="/files/rtumRLuyKTKx82wpLewA" alt="" width="375"><figcaption><p>按列看的三阶鱼</p></figcaption></figure>

这可太神奇了。矩形的用途不仅仅只用来横着看，其实也可以竖着看。这便是直观视角所要表达的一个鱼的特征：鱼的互补性。

**当找出了一个数字存在鱼的结构时，它的直观视角所用到的矩形，其实是作为“架子”用的。你横着和竖着去看这个矩形的行列，都能找出独立的鱼结构。而这两个独立的鱼，它们互相就是互补的。**

我们再看一个有鱼鳍的例子。

<figure><img src="/files/ILe9SBRZEvHoN6U7UBgQ" alt="" width="375"><figcaption><p>带有鱼鳍的鱼的直观视角</p></figcaption></figure>

我们横着和竖着分开看，就能得到两个带有鱼鳍的鱼。

<figure><img src="/files/s0lp68ybYRrvsBtsh5GK" alt=""><figcaption><p>两个互补的鳍鱼</p></figcaption></figure>

这次我故意找了个 $$m \neq n$$ 的题展示。因为矩形的长宽不同，所以互补的两个鳍鱼的规格其实并不相同，但是它们的鱼鳍一样，删数也完全一样。本质也都是同一个直观视角派生出来的。

## 为什么没有规格超过 5 的鱼？ <a href="#why-no-fish-whose-size-is-greater-than-4" id="why-no-fish-whose-size-is-greater-than-4"></a>

好了。下面到了揭晓谜底的时候了。为什么鱼的规格也不会超过 5。

因为公式 $$m + n + p = 9$$。由于我们知道最终形成互补的鱼的规格其实就等于 $$m$$ 和 $$n$$。而为了让 $$m$$ 和 $$n$$ 的数值都尽量大，我们不妨和数组一样，也假设 $$p = 0$$。于是，式子变为了这样：

$$
m + n = 9
$$

因为它们的和为定值，所以一旦一个数变大，另外一个数就会变小。而显然 9 这个数比较特殊，一旦有一个数超过了 5，另外一边的数必然会变为 4（比 5 小），以成为较小者。所以，这一点和数组完全一样：鱼的规格超过 5 的时候一定会存在规格比 5 更小的（不超过 4）的互补的鱼，因此实际上我们不需要考虑规格是 5 及以上的鱼的情况。

## 一些练习题 <a href="#exercises" id="exercises"></a>

下面给各位展示一些直观鱼的实际例子。请自行找出它里面的实际的鱼的视角。

<figure><img src="/files/McFyfx19uINVxQn45Wmn" alt="" width="375"><figcaption><p>题目 1</p></figcaption></figure>

这个题有两个鱼鳍。

<figure><img src="/files/NKznnABKMvncIMHkhPQ5" alt="" width="375"><figcaption><p>题目 2</p></figcaption></figure>

这个题规格很大。

<figure><img src="/files/oIQlGEsIEgpVBdpJ13JH" alt="" width="375"><figcaption><p>题目 3</p></figcaption></figure>

这个题甚至没有等于 4 的提示数或填入数。


# 鱼的命名

Naming of Fish

欢迎来到鱼的最后一节内容。这个部分的内容就留给各位拓展用。它不属于知识点，了解下就行，也以防我以后忘记，做个记录。

## 鱼的命名 <a href="#naming-rule-of-fish" id="naming-rule-of-fish"></a>

鱼的命名主要是由规格和鱼鳍的状态构成；如果算上孪生的话，孪生也会占用一个位置。

先说规格。鱼一共有 7 种规格具有独立的命名：

<table><thead><tr><th width="89">规格</th><th width="209">规格的名称</th><th>英文名</th></tr></thead><tbody><tr><td>1</td><td>一阶鱼 / 独眼鱼</td><td>Cyclopsfish</td></tr><tr><td>2</td><td>二阶鱼</td><td>X-Wing</td></tr><tr><td>3</td><td>三阶鱼 / 剑鱼</td><td>Swordfish</td></tr><tr><td>4</td><td>四阶鱼 / 水母</td><td>Jellyfish</td></tr><tr><td>5</td><td>五阶鱼 / 海星</td><td>Squirmbag / Starfish</td></tr><tr><td>6</td><td>六阶鱼 / 鲸鱼</td><td>Whale</td></tr><tr><td>7</td><td>七阶鱼 / 海怪（利维坦）</td><td>Leviathan</td></tr></tbody></table>

可能你会比较好奇的是，这个规格 1 是什么鬼？鱼还有只有 1 阶的？另外，为什么 5 - 7 阶明明都已经遇不到了，为什么还会有名字？

其实，1 阶就是之前我们说的行列排除技巧。注意，是排除，还得是行列排除，而不是唯一余数。要打通名称系统，这个现在还讲不了，因为超纲了。所以你暂时记住就行了。

然后是 5 - 7 阶。这种过大的规格的鱼其实也是为了之后一种鱼的类型而服务的。所以也属于超纲内容，记住就行。总之就是，这种规格的鱼会在之后的鱼的类型里出现。

然后是 5 阶的名字。在鱼的系统里，5 阶这个规格有两个名字，一个叫 Squirmbag，一个叫 Starfish（海星）。后者有中文翻译，也确实比较接地气（因为也确实是海洋生物）。但是前面这个名字是什么鬼？

下面我们就得掰扯一下鱼这个体系的历史了。不过我们稍微放一边。我先把命名的内容说完。

现在规格的名词都有了。还差的是鱼鳍的状态。先来说英文的部分。鱼鳍一共有这些状态：

* **没有鱼鳍**：`<名字>`
* **鳍鱼**：`Finned <名字>`
* **退化鱼**：`Sashimi <名字>`
* 孪生鱼
  * **孪生鳍鱼**：`Siamese Finned <名字>`
  * **孪生退化鱼**：`Siamese Sashimi <名字>`

然后我们把这些说法，配到前面规格的名词的左边就行，例如 Sashimi Swordfish、Siamese Finned Jellyfish 之类的。

再来说中文的。中文的命名则是这样：

* **没有鱼鳍**：`<多少阶>鱼`
* **鳍鱼**：`鳍<多少阶>鱼` 或 `<多少阶>鳍鱼`
* **退化鱼**：`退化<多少阶>鱼` 或 `<多少阶>退化鱼`
* 孪生鱼
  * **孪生鳍鱼**：`孪生<多少阶>鳍鱼` 或 `<多少阶>孪生鳍鱼`
  * **孪生退化鱼**：`孪生<多少阶>退化鱼` 或 `<多少阶>孪生退化鱼`

比如说孪生三阶鳍鱼、二阶退化鱼、二阶孪生退化鱼之类的。

总之，“孪生”两个字比较特殊，它要么放在最开头，要么就只能放在鱼鳍的修饰部分的左边。

## 鱼的命名由来 <a href="#naming-history" id="naming-history"></a>

可能在看了前面的命名之后，你还是有所疑惑。为什么看起来 1 - 7 阶里只有 2 阶不是鱼的名称。要说清楚这一点，我们就不得不回忆一下鱼这个体系命名的历史了。

最开始，鱼这个体系是不存在的。最初，数独游戏开始全球蔓延的时候，一个来自新西兰、在香港担任法官的、名叫**高乐德**（Wayne Gould）的人发现了二阶鱼这个技巧。因为它当时的推理方式是按照前文里“左上右下角填或右上左下填”的思维在思考，因此使用了一种叫 X-Wing 的战机为这个技巧取了名。

叫 X-Wing 的战机是哪里来的呢？它来自于星球大战这部电影。它大概长这样：

<figure><img src="/files/9LfiKYLgdPMAtQDqUkzL" alt="" width="375"><figcaption><p>X-Wing 战机</p></figcaption></figure>

> 图源：<https://static.wikia.nocookie.net/starwars/images/2/22/RedFive_X-wing_SWB.png/revision/latest?cb=20160915042221>

可以看到，它的机翼是 X 形状的，所以就叫它 X 机翼战机了；机翼在英语里也用的是 wing 这个词，所以就是 X-Wing 了。

对比一下 X-Wing 技巧你就可以发现，它的推理过程最终也是对角两处填入进去数字，构成的两种填法。如果我们用线条画出来，就非常像是 X-Wing 战机的机翼。这个技巧因此得名。

三阶鱼的名字 Swordfish 也不是随便取的。不过，它并非来自于海里游的鱼。和 X-Wing 的来源类似，三阶鱼的名字来自于一架叫做 Fairey Swordfish 的飞机。这种飞机在飞行的时候刚好是三层机翼的样子。

<figure><img src="/files/kzyqqOLQaXwelNZ427o8" alt="" width="375"><figcaption><p>Fairey Swordfish 飞机</p></figcaption></figure>

> 图源：<https://underwatermalta.org/discover/fairy-swordfish/>

如图所示。该飞机的机翼是上下两层的，而尾巴上有一点，飞起来就是三层的样子。

顺带一说，这个飞机名字还有一个别名叫 Stringbag（网袋）。具体的名字由来也可以参考上图给出的图片来源的链接。是的，这架飞机的 Stringbag 这个称呼的前缀换成了 Squirm（蠕动）就摇身一变成为了五阶鱼的叫法。

所以，鱼的命名系统来源并非是海里游的鱼，而是各种战机和直升机的叫法。但是恰好因为三阶鱼的 Swordfish 战机的名字带有鱼类的名称，所以后面才渐渐演变为各种鱼的名称。这便是为什么二阶鱼（X-Wing）没有鱼的对应名称的原因。

而台湾引入的名称“链列”，来自于数组。数组在台湾也有一个名称，叫做“链数”。比如说三数组在台湾叫做三链数。而因为数组和鱼自身因为结构的“相似性”，所以鱼就把“链数”的“链”字沿用了下来，并把第二个字改成了矩阵的台湾称呼“阵列”（array），并取了“列”这个字。这是台湾对鱼的称呼“链列”的由来。

最后，鱼的称呼和数组也是相似的。比如三数组、四数组对应到鱼里就是三阶鱼和四阶鱼。不过，其实严格的叫法应当是三鱼、四鱼之类的，“阶”这个字是不说的。只是这么叫很难去理解，也不符合中文的叫法，所以就补充上了“阶”这个字。严格叫法下，比如英语里，是确实存在诸如 2-fish、3-fish、4-fish 的写法的。


# XY-Wing 及推广

Regular Wing

今天我们来学习一个新的技巧类型：wing。这个技巧暂时没有合适的中文名，所以就直接沿用英文名来称呼这个技巧。

这种技巧依赖于多种情况的讨论，类似于讨论鱼鳍的填入和不填，只是将技巧的长相进行了推广。


# XY-Wing 及推广的基本推理

Reasoning of Regular Wing

## XY-Wing

<figure><img src="/files/4Q50LAMsgAbtgcmFW2ym" alt="" width="375"><figcaption><p>XY-Wing</p></figcaption></figure>

如图所示。我们把注意力集中到 `r8c5` 之上。这个单元格只有两个候选数：7 和 9。我们不妨根据所填的数字进行讨论：

* 如果 `r8c5 = 7`，则同列的 `r1c5 = 1`；
* 如果 `r8c5 = 9`，则同宫的 `r9c4 = 1`。

由于 `r8c5` 必须填的是这两个的其中一个，所以 `r1c5` 和 `r9c4` 里肯定会有至少一个位置填的是 1。

这能说明什么呢？`r1c4` 和 `r9c5` 这两处单元格比较特殊。这两个单元格刚好既和 `r1c5` 同一个区域，也和 `r9c4` 同一个区域。我们倒过来看，如果说我们让 `r1c4` 或 `r9c5` 的任意一个格子填上 1，就会同时让刚才我们提到的 `r1c5` 和 `r9c4` 都无法填上 1。

但是，这显然是不行的。我们刚才才得到这两个单元格必须至少有一个 1。所以，这便出现了矛盾。所以，根据前面的两种情况的假设，我们就直接可以得到结论 `{r1c4, r9c5} <> 1`。

我们把这个推理过程称为 **XY-Wing**。

我们再来看一个例子。

<figure><img src="/files/UuvjMYpvJshm16wjZhtc" alt="" width="375"><figcaption><p>另外一个 XY-Wing</p></figcaption></figure>

这个例子和前面几乎一样，所以希望你自己推理它。

## XYZ-Wing

<figure><img src="/files/n9Doch1oCiNBwL2XVRSU" alt="" width="375"><figcaption><p>XYZ-Wing</p></figcaption></figure>

如图所示。这个技巧其实就比刚才的 XY-Wing 多了一个候选数。

和前面的方式一样，我们这次讨论的是 `r3c2` 的填数情况。

* 如果 `r3c2 = 4`，则同列的 `r7c2 = 1`；
* 如果 `r3c2 = 9`，则同行（或者说同宫）的 `r3c1 = 1`；
* `r3c2 = 1`。

这意味着，`r3c2`、`r3c1` 和 `r7c2` 里肯定会有至少一个单元格填的是 1。

那么这一次又有什么单元格可以得到删数结论呢？`r1c2` 了。如果它填上 1，就会同时让刚才所说的三个单元格全部不能填 1，直接产生矛盾。

所以，`r1c2 <> 1` 是这个题的结论。

我们把这个结构（XY-Wing 上多了一个候选数）称为 **XYZ-Wing**。

我们再来看一个题。

<figure><img src="/files/WqRIV2m3Cw3iFuuXvaSq" alt="" width="375"><figcaption><p>另一个 XYZ-Wing</p></figcaption></figure>

这个例子也希望你自己理解。

## WXYZ-Wing

前面我们看过了 XYZ-Wing，是 XY-Wing 上增加了一个候选数得到的新结构。这次，我们再往上加一个格子。看看四个单元格能不能也能这样用。

<figure><img src="/files/ehweQqf9g8X7ZfMlNJYN" alt="" width="375"><figcaption><p>WXYZ-Wing</p></figcaption></figure>

如图所示。这次我们假设的是 `r2c2` 这个单元格。

* 如果 `r2c2 = 2`，则旁边的 `r2c3 = 3`；
* 如果 `r2c2 = 5`，则同宫的 `r3c1 = 3`；
* 如果 `r2c2 = 9`，则同列的 `r7c2 = 3`；
* `r2c2 = 3`。

那么可以发现，这次是整整四个单元格里至少有一个填 3。

和前面一样，我们仍然能找到一个删数单元格。如果 `r1c2 = 3`，则会同时使得四个单元格都不能填 3，满足不了至少一个填 3 的结论，于是就矛盾了。

所以，这个题目的结论是 `r1c2 <> 3`。

我们把这个技巧称为 **WXYZ-Wing**。

我们再来看一个例子。

<figure><img src="/files/dvkd91uSVPq1Cpj7hfmk" alt="" width="375"><figcaption><p>另一个 WXYZ-Wing</p></figcaption></figure>

如图所示。这个例子希望你能自己推理一下。

## VWXYZ-Wing

看得出来，老外已经词穷了。它尝试在往字母表里一个一个字母往上加就成为了一个新的技巧名。用到 Z 之后发现已经没有字母了，又开始往前面找。

既然 WXYZ-Wing 已经过了，下面就再加一个单元格，就成了新的技巧了：**VWXYZ-Wing**。

<figure><img src="/files/dgwtbdyeVP9CsCuJKkOx" alt="" width="375"><figcaption><p>VWXYZ-Wing</p></figcaption></figure>

如图所示。虽然推理完全和前面的一样，但是我还是解释一下。这次我们要假设的是 `r6c4` 的填数情况：

* 如果 `r6c4 = 4`，则同行的 `r6c7 = 1`；
* 如果 `r6c4 = 7`，则同行的 `r6c3 = 1`；
* 如果 `r6c4 = 8`，则同宫（或者说同列）的 `r5c4 = 1`；
* 如果 `r6c4 = 9`，则同宫的 `r4c6 = 1`；
* `r6c4 = 1`。

我们发现，这个例子里，仍然有删数结论。假设 `r6c6 = 1` 的话，则会同时使得前面假设的 5 个单元格全部没办法填 1。所以，结论就是 `r6c6 <> 1` 了。

我们再来看一则例子。

<figure><img src="/files/3tgyK3cOlWLfNVYWXdeO" alt="" width="375"><figcaption><p>另一个 VWXYZ-Wing</p></figcaption></figure>

也是一样，这个例子就给你自己推理了。

## 这种技巧的规格 <a href="#size-of-regular-wings" id="size-of-regular-wings"></a>

可以通过技巧看出，它其实就是逐渐在扩展结构的规格，也就是使用的单元格数量。当然，除了 XY-Wing 变为 XYZ-Wing 的时候只是加了一个候选数而已。这个是名称的历史由来的问题。这我们一会儿说。

这个技巧的极限情况是多少呢？理论来说，这个技巧应该最大可以到 9 个单元格。但是因为越大的规格的这个结构，形成条件也就会越苛刻（毕竟有一个单元格需要有和单元格数量一样多的候选数数量），所以这只是个理论数值。

现在能够从题目里找到的最大规格是 5，即上面的 VWXYZ-Wing 就已经是最大的情况了。

另外，名称的话也是随着单元格数量变化的。和 WXYZ-Wing 以及 VWXYZ-Wing 一样，再大点，字母就会再多一些。所以不难想到后面的名字都是什么：

* 6 个单元格：UVWXYZ-Wing
* 7 个单元格：TUVWXYZ-Wing
* 8 个单元格：STUVWXYZ-Wing
* 9 个单元格：RSTUVWXYZ-Wing

不得不说，这个技巧的取名真的省事。

## 历史由来 <a href="#history-of-naming-of-wings" id="history-of-naming-of-wings"></a>

现在我们来说说为什么这个规格的命名并不是严格遵守的。

可以发现，XY-Wing 到 XYZ-Wing 并没有按多一个单元格方式在推广。相反，XY-Wing 只有两个字母，却上手就用了三个单元格。这个神奇的情况也占用了一个技巧名。

这个的原因是来自于这个技巧的来源。看前面的 XY-Wing 似乎我们看不太出来它的来源。但是如果你把宫内的两个单元格强行移动到行列上去，让这个结构的两个分支“垂直”，你就会发现，它长得很像是二阶鱼的“异数”版本。

二阶鱼是假设出两种填数情况，在排列的时候形成交叉填入的 X 字母形状。而 XY-Wing 在假设的时候，也是随其中一个位置开始假设两种填数，并最终影响到两端的填数。二阶鱼的删数是两个完整的行列；而 XY-Wing 的删数，则也取决于两端填数的影响的范围。

所以，XY-Wing 这个技巧的名字其实是来自二阶鱼的。回忆一下，二阶鱼的英文是什么？X-Wing。所以，不难想到，XY-Wing 就是因为用到了两个数字的假设，因此把 X 改成了 XY。

在之前的历史里，我们说到，X-Wing 的 X 并不是未知数，而是一架飞机的代号。但是，推广到 XY-Wing 时，X 被当成了未知数。换言之，二阶鱼确实用到的是一个数字内部的填数关系，所以 X 也可以理所应当地理解为一个数字。而 XY-Wing 则为两个数字的假设关系，因此 XY-Wing 就这么得来的。

而 XYZ-Wing 以及后面的名称，则是发现 XY-Wing 并不是“完整”的。所谓完整的，可以看到，从 XYZ-Wing 技巧开始，后面所有的结构，假设的单元格本身都带有和单元格总数量一样多的候选数数量。但是 XY-Wing 不是。XY-Wing 刚好少一个。少一个什么呢？少一个 XYZ-Wing 里的那个“Z”，也就是那个删的数字。

所以，再补全后，刚好因为 XYZ-Wing 用到三个字母就补齐了命名上字母的使用情况，因此，后面的技巧名也就随单元格数量直接加字母就行了。几个格子就用几个字母，然后从 Z 字母开始，从后往前数相同数量的字母，然后拼上 -Wing 就是这个技巧的名字了。


# XY-Wing 及推广的残缺逻辑

Incomplete Regular Wings

前面的内容里，我们介绍了这种逻辑的统一推理思路，是排列各种填数组合并，得到一个或一组删数结论。

不过，我们在最开始的两个技巧 XY-Wing 和 XYZ-Wing 里看出，XYZ-Wing 以及后面的 WXYZ-Wing、VWXYZ-Wing 都是在往上追加单元格。但这一点和最开始 XY-Wing 变为 XYZ-Wing 的方式不同。XY-Wing 只加了一个候选数就变为了 XYZ-Wing。

虽然我们知道这是历史原因所致，但倘若我们继续以这种形式，在 WXYZ-WIng 和 VWXYZ-Wing 的推理上“做手脚”的话，是否就有另外的结构了呢？

## 残缺 WXYZ-Wing（Incomplete WXYZ-Wing） <a href="#incomplete-wxyz-wing" id="incomplete-wxyz-wing"></a>

<figure><img src="/files/tBAN7TO4SfDxt0hKcYkq" alt="" width="375"><figcaption><p>残缺 WXYZ-Wing</p></figcaption></figure>

如图所示。这是一个 WXYZ-Wing 吗？还是 XYZ-Wing 呢？看起来 WXYZ-Wing 的话，好像 `r4c2` 上缺少了一个候选数 3；那是 XYZ-Wing 吗？好像也不是，因为格子已经不止 3 个了。

不过，我们按之前 WXYZ-Wing 的思路推理这个，应该也可以得到结论。假设 `r4c2` 的各种填数情况：

* 如果 `r4c2 = 4`，则和它同宫的 `r6c1 = 3`；
* 如果 `r4c2 = 5`，则和它同宫的 `r6c3 = 3`；
* 如果 `r4c2 = 8`，则和它同行的 `r4c4 = 3`。

显然，由于这个看起来缺了个数的 WXYZ-Wing 仍然具有和 WXYZ-Wing 一致的推理逻辑。倘若我们此时让 `r6c46` 的其中任意一个位置填入 3，只要有一个，它就能同时使得 `r6c13` 以及 `r4c4` 全都填不了 3，这样就产生了矛盾。所以，这个题的结论就是 `r6c46 <> 3`。

我们把初始假设分支的单元格称为**拐点**或**折点**（Pivot）。比如说这个题的拐点是 `r4c2`。然后，我们把这个在拐点上少一个候选数的 WXYZ-Wing 结构称为**残缺 WXYZ-Wing**（Incomplete WXYZ-Wing）。

我们再来看一个例子。

<figure><img src="/files/zE30Eq44ktwm31Nl2apm" alt="" width="375"><figcaption><p>另一个残缺 WXYZ-Wing</p></figcaption></figure>

如图所示。这个题希望你自己推理。

## 残缺 VWXYZ-Wing（Incomplete VWXYZ-Wing） <a href="#incomplete-vwxyz-wing" id="incomplete-vwxyz-wing"></a>

<figure><img src="/files/fCWQx5SSNtkoKAjugsmk" alt="" width="375"><figcaption><p>残缺 VWXYZ-Wing</p></figcaption></figure>

如图所示。这次我们从 VWXYZ-Wing 里抠掉一个候选数。

这次，我们假设 `r7c4` 的所有的填数情况：

* 如果 `r7c4 = 1`，则和它同宫的 `r9c5 = 6`；
* 如果 `r7c4 = 3`，则和它同宫的 `r9c6 = 6`；
* 如果 `r7c4 = 4`，则和它同列的 `r1c4 = 6`；
* 如果 `r7c4 = 8`，则和它同列的 `r2c4 = 6`。

和前面一样。他们都指向了同一个数字 6。如果此时我们让 `r8c4 = 6`，则会直接导致 `r9c56` 和 `r12c4` 四个单元格都不能填 6 出现矛盾。所以 `r8c4 <> 6` 是这个题的结论。

我们把这个技巧称为**残缺 VWXYZ-Wing**（Incomplete VWXYZ-Wing）。

我们再来看一个例子。

<figure><img src="/files/uzjmefl5F4FHhrAh52oQ" alt="" width="375"><figcaption><p>另一个残缺 VWXYZ-Wing</p></figcaption></figure>

这个例子也希望你自己推理。

那么，这个技巧的内容就全部结束了。下一节我们将进入新的技巧的学习。


# W-Wing

W-Wing

前面的内容我们已经介绍过了 XY-Wing 的推理，以及规格的推广，和残缺模式。下面我们来介绍另外一个、从 XY-Wing 推广，但结构不太相同的技巧。

## 基本推理 <a href="#reasoning" id="reasoning"></a>

<figure><img src="/files/MpDQBWtwzPnLS0MLCz9l" alt="" width="375"><figcaption><p>W-Wing 结构</p></figcaption></figure>

如图所示。这个结构将原有的 XY-Wing 的拐点单元格改造成了一个区域的两个填数位置。这次我们和之前的假设完全一样，不过讨论 `b2` 的填数。

* 如果 `r1c6 = 4`，则因为 `r1c9 <> 4` 的关系，此时 `r1c9 = 6`；
* 如果 `r3c6 = 4`，则因为 `r3c1 <> 4` 的关系，此时 `r3c1 = 6`。

我们恰好发现，`r1c9` 和 `r3c6` 具有完全一样的候选数，所以在假设 `r1c6` 和 `r3c6` 的两种填数位置的情况时，最终结论那一边的单元格必定填的是相同的数字 6。

这能看出来什么呢？显然这两个情况里的结论必须有至少一个成立，因为他们都是走 `b2` 里所有数字 4 的全部填数位置派生出来的情况。而这两种情况必定指向了要么 `r1c9` 要么 `r3c1` 填 6 的结论。所以，`r1c23` 是不能填 6 的——这两个单元格但凡有一个是 6，都会同时让 `r1c9` 和 `r3c1` 这两个刚刚才得到必须至少有一个 6 的结论直接破掉，于是就矛盾了。

所以，`r1c23 <> 6` 是这个题的结论。

这个技巧的推理逻辑的整理来自于一个名为 Woods 的人，因此为了纪念他对这个数独技巧的贡献，就沿用了名字作为技巧名称，并由于它类似于 XY-Wing 的推理过程，所以将 XY-Wing 的“XY”部分剔除，改成 Woods，即 **Wood's Wing**。而一般在称呼此技巧时，我们用的是这个技巧的简称，即 **W-Wing**。

和之前 XY-Wing 也一样，因为它也不太好翻译，所以也没有中文名。中文环境下也使用的是 W-Wing 在称呼这个技巧。

下面我们再来看一个例子，不过就自己推理吧。如下图所示。

<figure><img src="/files/yFeBGN7gwMcekT1OMofH" alt="" width="375"><figcaption><p>W-Wing，另一个例子</p></figcaption></figure>

## 多分支 W-Wing（Multi-Branch W-Wing） <a href="#multi-branch-w-wing" id="multi-branch-w-wing"></a>

下面我们来推广 W-Wing 的分支。

<figure><img src="/files/vkDRnzFCyKBYnf3DI1tF" alt="" width="375"><figcaption><p>多分支 W-Wing</p></figcaption></figure>

如图所示。和前面的例子几乎一致，只是 `r2` 这里用到的原本是两个数，现在改成了三个数。所以需要讨论三种情况：

* 如果 `r2c1 = 3`，则 `r6c1 = 5`；
* 如果 `r2c2 = 3`，则 `r7c2 = 5`；
* 如果 `r2c4 = 3`，则 `r4c4 = 5`。

显然，这三种情况必须有一个成立，所以 `r6c1`、`r7c2` 和 `r4c4` 里至少会有一个位置填 5。所以，`r4c2` 是不能填 5 的，否则会直接矛盾。因此，这个题的结论是 `r4c2 <> 5`。

我们把这个称为**多分支 W-Wing**（Multi-Branch W-Wing）。我们再来看一个例子，这个例子也希望你自己理解。如图所示。

<figure><img src="/files/ogTeXdb9lajScZ6kcFlw" alt="" width="375"><figcaption><p>多分支 W-Wing，另一个例子</p></figcaption></figure>

至此，W-Wing 的内容就结束了。还算比较容易理解的，对吧？


# 唯一矩形（UR）

Unique Rectangle

欢迎来到新的数独技巧。从这个技巧开始，我们将会连着介绍一组难度不大，但推理思路比较脱离常规思维的技巧类型：**致命结构**（Deadly Pattern）。

简单来说，致命结构的本质是基于游戏唯一解的要求，所以它的思维会显得比较神奇一些。

为了方便介绍后面的东西，和鱼一样，致命结构这个大体系在前面我们只会讲解一部分简单的、易于理解和方便找到的一部分内容；剩下的部分我们会放在以后再说。


# 唯一矩形的基本推理

Reasoning of Unique Rectangle

欢迎来到新的数独技巧。这个数独技巧的推理过程会比较神奇一些，请跟着我的思维一起学习起来吧！

## 推理过程 <a href="#basic-reasoning" id="basic-reasoning"></a>

<figure><img src="/files/AE695m7Two0QaVYZtG8H" alt="" width="375"><figcaption><p>例子</p></figcaption></figure>

如图所示，我们可通过一些基本的技巧推理过程来到这里。

我们发现，这里有四个单元格展示出了异样的情况：`r79c47`。

请仔细观察这四个单元格。我们发现其中三个单元格都只有候选数 2 和 3，而剩下的 `r9c4` 则除了 2 和 3 外还有一个多的候选数 9。由于我们无法继续进行推理过程，那么我们不妨就假设这个奇怪的候选数 9 不存在，再看看这里会有什么新的问题发生。

假设 `r9c4 <> 9`，则它会从盘面里消失，于是乎 `r79c47` 就完全一样了。完全一样意味着什么呢？那我们不妨把 2 和 3 给填进去。显然，因为四个单元格构成了“闭环”，这意味着只要随意往其中填一个数，那么和它同行列的另外一个单元格也就确定了填数，于是四个单元格都会确定下来。

那么，因为它只有 2 和 3，所以可填的状态就只有两种：

* `r7c4` 和 `r9c7` 填 2，剩下俩填 3；
* `r7c4` 和 `r9c7` 填 3，剩下俩填 2。

那么，我们把他填进去，就可以得到这样的盘面：

<figure><img src="/files/Kz3voNv7xhxWeDdSzpft" alt=""><figcaption><p>两种填法对应的盘面</p></figcaption></figure>

我们可以从题目里看出，除了刚才我们说的这四个单元格外，其余的单元格都完全一样。不论是提示数，还是填入数，还是候选数，甚至候选数剩余的种类，全部一样。

我们试想一下。这是我们在假设了 `r9c4 <> 9` 之后产生的情况。这四个单元格填充的方式有两种，但却“殊途同归”。我们知道，一个合格的数独题目必须具有唯一解，这意味着每一个空格都只能有唯一的一种填数情况。而我们认为这个题是唯一解的，那么，在其他除开这四个单元格外，其他单元格的状态完全一致的情况就不可能被我们遇到。

因为，`r79c47` 这四个单元格的变动压根就不足以影响到任何这些完全没有变化的单元格。也就是说，我们在左边的盘面里随便怎么填一个数，那么右边其实填那个数也没有任何的问题。反之亦然：左边填一个 3，右边对应位置也可以填一个 3；左边填一个 1 和 4，右边同样的位置也可以填一个 1 和 4；左边能填完整个题，右边也能填完整个题。

但是很显然，就 `r79c47` 而言，四个单元格的填数已经不同。题目要真能允许我们这样“肆无忌惮”地填数的话，这就会违背唯一解的规则——这样四个单元格都填上数字了，这要还能有解的话，岂不是右边的盘面也得是有解的。但是，一个唯一解的题是容不得像图上这样有单元格填数不同却仍然有解的状态的。毕竟我们要求的唯一解需要满足一个非常底层的规则：所有单元格最终都只会存在一个正确的填数情况。所有其他的填数可能对于唯一解的题来说一定得是错误的。

所以，这并不符合一个唯一解必备的题目长相。那么，我们就得到了矛盾。而矛盾的开端呢？就是假设的 `r9c4 <> 9` 了。因为这个结论在假设后造成矛盾，所以结论不正确；相反，不填的反义词是填入。所以这个题的正确结论应该是 `r9c4 = 9`。当然，你也可以说它的结论是 `r9c4 <> 23`，也没问题。

我们把这个技巧称为**唯一矩形**（Unique Rectangle，简称 UR），其中“唯一”表示的是这个技巧利用的是题目唯一解的规则，而“矩形”指的是结构的长相是一个长方形一样的形状。

## 对唯一矩形的一些常见疑问 <a href="#questions-about-unique-rectangle" id="questions-about-unique-rectangle"></a>

这是这个技巧的基本推理过程。下面我们针对于这个技巧的一些外围内容进行解释和梳理。

### 问题 1：唯一矩形的结论是删数还是出数？ <a href="#question-1" id="question-1"></a>

这是我在讲解这个技巧的时候，经常被人问起的问题之一。由于它属于候选数技巧，所以它的本质是借用候选数的推断来下结论的，所以既然候选数正确能引发矛盾，所以理应它是一个删数技巧（毕竟填了之后才发现错了嘛）。可我们从前面的推理过程中得到的是，它的结论似乎告诉我们，剩下的那个数它一定就是对的。

这个问题要从结构本身出发。因为我们假设的是这个候选数 9 从盘面消失，才会导致一系列的连锁反应，并最终得到矛盾。那么，这很明显存在一个潜在的问题——这个多出候选数的格子从来就不一定非得只有三个候选数。刨去唯一矩形用到的那两个数，也就是说它不一定非得只能多一个数。

实际上，它可以多出很多候选数出来。我们来看这个例子。

<figure><img src="/files/P8NWBuAxqlcZH9pfldVZ" alt="" width="375"><figcaption><p>不止多一个候选数的唯一矩形</p></figcaption></figure>

这次的唯一矩形是竖着长的。

之前那个例子里，我们假设的是多出来的候选数 9 从盘面里消失。这次我们也一样，不过这次得把多出来的全部候选数当成一个整体，让他们全消失。

显然，这是可以的。实际上我们也必须得这么假设：只有当他们全消失，候选数 1 和 8 才会显现出来引发矛盾的特征。所以这个题的初始假设是 `r2c7 <> 3469`。当然，因为这些候选数消失了，所以全部的候选数 1 和 8 会显现出来，之后的逻辑就和前面那个例子剩下的部分完全一样了。所以最终肯定也可以得到矛盾的。这后面的部分我就不重复说明了。

总之，因为初始假设条件是候选数 3、4、6、9 全部从盘面消失。所以它矛盾后，就得把这个说法从逻辑上取个反。那“全消失”的反面是什么呢？它的反向情况自然就是至少有一个数是对的。

> 如果你绕不过来，可以稍微借用数学的思维来思考：“3、4、6、9 都消失”就意味着这个单元格里，在 3、4、6、9 这个候选数集合里有 0 个数是正确的填数，毕竟全部都不对、都消失了嘛。而“等于 0 个”的相反情况是“不等于 0 个”，而“不等于 0 个”里包含的“有负数个”的说法是不合逻辑的，直接去掉，所以不就只剩了“超过 0 个”的情况了么。
>
> 当然，更严谨的说法是“只能有一个”。显然同一个单元格本身就不可能填多个数字进去，所以就算是至少有一个对，也只能填一个。不过这里就不纠结这个了，说至少一个和说填一个，反倒不是我们要强调的地方。主要还是想说“3、4、6、9 里有对的数字”这个结论。

那么，至少有一个数是对的，也就意味着我们无法确定里面的正确填数究竟是哪一个。所以，本质的结论是什么呢？结论其实应该是数字层面的反面：不填 1 和 8。

> 简单解释来说就是，`r2c7` 包含的候选数有 6 个。我们将其按照假设的情况分为两个部分：1 和 8，以及剩下的四个候选数。假设 1 和 8 这个集合名字叫 $$A$$，然后剩下的四个候选数我们取名叫它 $$B$$。
>
> 因为我们知道，因为整个单元格必须只能填一个数，而结论告诉我们集合 $$B$$ 提供了这个数，自然就没有 $$A$$ 什么事情了。所以，把候选数 1 和 8 删掉，才是这个题的真正结论，即结论为 `r2c7 <> 18`。

这就是我想说的。所有的唯一矩形的推理，结论都应该是删掉多出来候选数那个单元格里，是唯一矩形用到的那两个数，而不是与之无关的数填进单元格。因此，唯一矩形严格意义上仍然是删数技巧。

### 问题 2：唯一矩形非得是矩形吗？ <a href="#question-2" id="question-2"></a>

或许你会好奇，发明这些技巧的人脑子都是怎么长的。比如这个唯一矩形，凭什么它得是矩形？梯形不行吗？

要解释清楚这个问题，我们需要知道，唯一矩形要奏效（引出矛盾）的根本原因。

我们发现，整个推理导致矛盾的点在于，四个单元格会产生的两种填法，并不会影响这个题目里其他所有格子的候选数状态。当然，提示数和填入数是影响不了的。那么，“是否是矩形”这个问题就可以改为“要使得这种影响不了的状态，需要结构长成什么样”。

首先我们能想到的是，这个结构是否可以变为别的形状。显然，四个格子要能形成闭环，那还得是四个单元格在行列宫之间有两两相邻的这样一个规则限制。既然有这样的限制，那么边就不能随意构造，此时能满足的结构就只有梯形了。

也就是说有这么几个情况：

<figure><img src="/files/mHfi6Ju20cfLLHbLgJXh" alt=""><figcaption><p>一些可能的摆放</p></figcaption></figure>

> 有人问，正方形可不可以。正方形从本质上并没有改变矩形的说法。倒不是说什么正方形是特殊的矩形，主要还是在于，前面的例子，形成矩形的原因还是因为四个单元格有两侧会相隔甚远，距离太大所以导致的。要是什么题四个格子可以摆到一起，不就正方形了么。所以从本质上来说正方形并不会有什么问题。

那么我们就找一个梯形的例子看看就知道了。

<figure><img src="/files/86m99G1aVFaMLNxBk0JB" alt="" width="375"><figcaption><p>一个梯形</p></figcaption></figure>

如图所示。可从候选数状态看出，四个单元格都是 6 和 9 了，但似乎确实好像没问题。我们看看唯一解的题是不是允许这种梯形的存在。

首先，我们不妨去假设 6 和 9 的填入，于是我们可以得到两种填法：

<figure><img src="/files/PqRGxxmQLg6ZmszH2aUP" alt=""><figcaption><p>梯形结构的两种填法</p></figcaption></figure>

可以看出，此时就和前面的例子不同了：我们发现，由于 `c1` 在四个格子里只有 `r5c1` 在 `c1` 的原因，所以它填入 6 和 9 会产生的效果不同。其他的列也都如此。比如说两个填法下，`r2c1` 就是不同的：左图里只有候选数 8，而右图却有 8 和 9。再比如 `r1c2` 里，左图有 1、8、9，而右图只有 1 和 8。

当我们得到这一点不同后，我们就无法进行下一步假设了。因为唯一矩形的矛盾点要求两个盘面在填了四个数后状态还得是一样的，但很明显现在就不一样了。不一样就意味着这么填数会对其他单元格有影响。有影响了就说明这两种填法本身是独立的。也就不存在后面说的一边是啥另一边也得是啥的说法了。

这个便是图上梯形不奏效的根本原因：由于梯形的形状，导致结构横纵方向上存在对部分单元格不同的影响（毕竟斜着的那条边，两个单元格在横纵方向上就一定不同了），也就无法引出后续的推导步骤。

好了。既然如此，梯形不行的根本原因就被我们拿下了。可我们发现，前面的示意图里还有一种矩形形态，它只是用到的宫从两个变为了四个。这会有什么不一样么，还得单列出来？

实际上，这个摆放也是不行的。下面我们也找出一个例子予以说明。

<figure><img src="/files/JMaHoOptmJMZhVlW8x1l" alt="" width="375"><figcaption><p>跨四个宫的矩形</p></figcaption></figure>

如图所示。可以看到这个例子也是只有 2 和 3 的候选数，根本不存在额外的数字，这就说明它也是不能用唯一矩形的技巧推理的。

推理过程完全一样，直到我们发现本题里这四个单元格的 2 和 3 的排列会对单元格有不同影响时：

<figure><img src="/files/iISYMGP73X6t3xyOO7Ns" alt=""><figcaption><p>跨四个宫的矩形的两种填法</p></figcaption></figure>

很显然，虽然行列上并不会影响什么，但是在宫里，因为四个单元格每一个格子都占用一个宫的关系，所以填数的不同会影响到宫内的空格，于是便会造成不同的影响。例如 `r1c2` 里左图里是 3 和 7，但在右图里就变为了只有 7。

因此，和前面梯形的结果一样，由于单元格会有不同影响，所以也就无法继续进行后续的推理，也就不能用唯一矩形的技巧来得到矛盾了。

那么，说明清楚后，我们对唯一矩形的结构有一个新的认知：

**要让一个结构能够形成合适的唯一矩形且可以推理，它必须使用四个摆放形成矩形的单元格，且单元格必须只用到两个宫。**

这就是唯一矩形最底层的结构形成原理了。

### 问题 3：残缺的唯一矩形是否影响推理？ <a href="#question-3" id="question-3"></a>

我们之前总是会遇到残缺的逻辑。鱼的残缺、各种 Wing 的残缺什么的。那么，如果唯一矩形是残缺的，那么它是否会影响推理呢？比如下面的这个例子。

<figure><img src="/files/qulELavFbOBzA8szEPmR" alt="" width="375"><figcaption><p>缺了一个数的唯一矩形</p></figcaption></figure>

如盘面所示。本题的删数是 `r3c4(8)`。那么，这个数能否删掉呢？

按照基本的推理，数字 2 和 8 会填入进去，然后查看候选数状态是否一样。但很遗憾的是，本题的 `r3c4` 只有 8，并没有 2 的存在。

这是否意味着，这个例子只有一种填法，而不会产生变换呢？并不会。这是初学者最常见的无法理解的问题。

<figure><img src="/files/G3ypXP72yy2nFqYRW79J" alt=""><figcaption><p>两种填法（？）</p></figcaption></figure>

我们对比两个盘面，候选数状态一致，然后产生两种填法，对吧？可是你会问我，这个 `r3c4` 明明已经没有 2 了啊，其中的第一种填法根本就不可能出现了。

其实不然。你这么去想这个问题。这个 `r3c4(2)` 本身已经不存在了，但它“曾经”出现过。既然曾经有这个候选数，那么我们就可以还原回去，将其补充上去使其成为完整的结构。

看到这里，你多半都不会直接认同我的这个观点。因为这个描述里存在两个暂时没有提及或解释清楚的东西：

1. 你怎么知道这个候选数是曾经出现过的？
2. 为什么删掉了的候选数仍然可以补回去？

下面就对这两个问题进行解释。

第一个问题。我怎么知道这个候选数曾经存在过。其实很简单，看盘面的提示数即可。提示数在给出之后，候选数状态就已经定下来了。这个时候，此时是候选数在盘面之中最多的时候。因为我们后续的步骤要么是出数，要么是删数。出数操作会引起一大片的删数（所在的相关单元格的空格里都不能再填入这个数）；而删数操作则会小幅度引起一个或一些的删数。总的来说肯定会引起候选数数量的减少，而不会增加。

很显然，在盘面初始状态时，候选数最多；而这个时候的候选数状态，其实就是只依靠基础排除技巧（或者说唯一余数的数数）而产生的情况。比如说，假设我有一个盘面里，`r1c1` 是提示数 1，那么此时的 `r1c1` 的所在行列宫里，只要是空格，就不能存在候选数 1。这是初盘就暗藏存在的基本删数情况。而一旦出现这些提示数，那么我们就可以根据排除的操作进行删数，自然就有了候选数的初始状态。

那么，如何对比一个数是否存在呢？这就很简单了：直接看该单元格的所在行、列、宫的提示数，是否有这个数即可。比如说题目里的 `r3c4`。它的相关单元格里的提示数是没有数字 2 的。如果没有 2，是否就意味着我们排除不到数字 2 上去，是否就意味着初盘是存在这个候选数的？这就是为什么我可以直接说，这个候选数 2 其实是存在的的原因。

然后是第二个问题。为什么删掉了的候选数还可以补回去。这也很简单。这甚至都不用说这么多，其实一句话就可以解释清楚：因为它是我们之前删掉的，我们有权控制删数的先后顺序。每一个步骤都是我们通过 100% 的、正确的、严谨的逻辑得到的结论。而这些结论既然已经得到，就说明它是过往产生的删数。这些删数我们知道一定是对的，那么我们就可以认为，只要做题尚未结束，我们就可以控制它在任何时候被去掉。比如说，我知道 `r2c2 <> 2` 是正确的结论，假设我在其中第 10 个步骤的时候得到的该结论，那么我可以在初盘就删掉它，也可以第 10 步之后才删掉它。因为你做题的操作是随意的。就好比你在做题操作期间先发现别的，然后才发现它。如果你优先发现到它了，那么它就可以先用；你之后才发现它，可能就只能在后续步骤里才能用。但这并不影响什么，因为我们都知道它客观上就是错误的，所以我们可以安全地在任何时候控制是否删掉它。

所以，既然我们知道它之前存在过，而且还知道它是错误的，那么我们可以还原回去，等先使用了唯一矩形的基本推理规则后，然后去删掉它，这种思维并没有什么不妥；而且，这种思维方式不限制它残缺的具体位置。只要它是不全的，不论缺少的是删数部分还是结构部分，我们就可以视为残缺的，然后补全进行使用。

### 问题 4：提示数也能有唯一矩形形态吗？ <a href="#question-4" id="question-4"></a>

那么，提示数能用唯一矩形技巧吗？或者说，因为唯一矩形的形态（也就是导致矛盾的那个形态）在唯一解的题里不存在，那么是否就意味着如果一个题里出现了这种形态的数字的摆放，这个题就是不唯一解的呢？

例如这个题。

<figure><img src="/files/Jvn5B9HUxSmYeWt3Xri2" alt="" width="375"><figcaption><p>包含有唯一矩形的形态的题</p></figcaption></figure>

如图所示。可以看到，很明显的 `r12c18` 构成的唯一矩形的那个矛盾的摆放形态。你觉得这个题是否唯一解呢？

题目肯定是唯一解的，所以所谓“提示数不能形成唯一矩形那样摆放的形式”这种说法肯定是无稽之谈。因为提示数是题所固定的数字，这些数字根本就由不得你去改。你改他们就等于说是你把题给改了。所以题唯一解与否跟提示数摆成这样没有任何关系。下一个。

### 问题 5：唯一矩形能用于其他非唯一解的题目吗？ <a href="#question-5" id="question-5"></a>

很显然不能。既然在最后下结论得到矛盾这里要求题目唯一解才能造成矛盾，那自然就不能用在非唯一解的题目之中。

那么，可能你有一定的好奇心想问我，我真要是将唯一矩形用进多解或无解题之中去了，这最终究竟会如何呢？既然你诚心诚意地发问了，那我就大发慈悲地告诉你。

首先是无解题。无解题的本质意思是说，做到后面某一步的时候，必然有行列宫上的冲突。这就不关你是不是用了唯一矩形了，这种矛盾的本质是因为它最终给的初始条件（那些提示数）自身就存在矛盾。虽然这种矛盾不一定是初盘就一眼看得出的矛盾，也可能是做到后面才能发现的矛盾，但是这种题既然有矛盾就不可能等到最后出唯一矩形的时候了。也就是说，既然题有问题，就不可能存在你用了唯一矩形反而改成唯一解甚至多解的情况。

再来说多解题。多解题确实比较复杂。多解题在使用唯一矩形后什么情况都有可能发生——题可能不变（仍多解），也可能改成唯一解，甚至是无解。

能造成多解其实并不奇怪，因为题目本身就是多解的，如果存在非常多的填法的话，即使你使用一次唯一矩形，也不会影响题目是多解的结论。这种情况并没有什么特别需要说的。主要说明的是导致题目成为唯一解和无解的情况。

先来说导致无解的情况。我们随便找一个双解题，即只有两个解的题目。

<figure><img src="/files/QvgjdxAP8mL4TLd7MmA3" alt="" width="375"><figcaption><p>一个多解题</p></figcaption></figure>

如盘面所示。显然我们这里有三处是可以直接得到填数 3 的。得到之后可以发现，1 和 2 是无论如何都不能确定的，因此这个题具有两个答案。

但是，假设我们暂时不关注这几个 3 的填数，而是去看这个唯一矩形，你就会发现，这里的唯一矩形可以直接得到 `r7c5 = 3` 的结论。此时它将直接导致刚才我们留空的三个填 3 的单元格无法 3，致使出现无解局面。这就是多解题误用唯一矩形导致无解的其中一种情况。

> 实际上导致这样的境况的例子非常多，也不一定非得只有四个留空的双解题才能这样。你完全可以自己构造一个题出来。这个例子是为了演示导致无解的局面所以故意构造出来的情况，其他位置都有数字是为了避免你去关心这些没有关系的单元格，所以初始状态下给的数就比较多。

下面我们来看一个比较奇怪的情况，多解题使用唯一矩形会导致变为唯一解的情况。

<figure><img src="/files/ndTmpdR1hZzXna7mC8xz" alt="" width="375"><figcaption><p>另一个多解题</p></figcaption></figure>

如盘面所示。这其实是一个多解题，虽然看起来不太像是一个多解题，但是它确实一共包含了三个不同的解，你可以试一下。

可以看到，这个结构有两个交织在一起的唯一矩形结构，一个是关于 1 和 3 的，另外一个则是关于 1 和 2 的。很显然，我们随便使用哪一边的唯一矩形，都会直接导致 `r4c4` 可以直接出数，于是后面的单元格因为出数的关系，就全部可以填完。而从这个视角上来看，因为是多解题，你使用了唯一矩形，题的剩余空格甚至可以全部填完，而且不会存在冲突，也不会存在多种填数情况——后面是可以一直做下去的。可以看到，这是多解题在使用了唯一矩形后，变为唯一解的情况。

> 和前文一样，本题的其他位置都有数字，但实际上的多解题并不一定非得如此才能遇到上面这样的形式。只要外侧的填数都能在不使用唯一矩形这样利用唯一解的方式进行做题，且可以一直往下做到只有上面这样的局面的时候，这样的情况也是可以的。

所以，在平时做题过程之中，这样的情况时有发生（时不时会遇到一次，比如题目本身就有问题导致多解）。而且我们反复强调，唯一矩形不能用在非唯一解的题目之中，因此不要胡乱使用唯一矩形技巧，它是有先决使用条件的。而且，多解题是可能在使用了唯一矩形后变为唯一解的，此时有可能会造成玩家对“唯一解”的理解出现概念上的偏差甚至是错误，以为这个题本身就是唯一解的。所以，千万不要在多解或无解题里使用唯一矩形，以及后面会说到的一些利用唯一解作为证明矛盾的所有致命结构技巧。


# 唯一矩形的类型

Subtypes of Unique Rectangle

之前我们介绍到唯一矩形的基本推理思路和原理。由于唯一矩形的思维独立于我们之前学到的任何一个数独技巧，所以它可以搭配之前学过的技巧的推理方式产生不同的思路。我们把这些唯一矩形都进行了类型的归纳。

按照约定俗成的规矩，我们把之前介绍的那个基础推理过程归为**类型 1**（Type 1）。那么本文将为大家介绍后续的一共 6 种新类型的推理逻辑，先从**类型 2**（Type 2）开始。

## 类型 2（Type 2） <a href="#type-2" id="type-2"></a>

<figure><img src="/files/YDb4vI4RMWN11zzcpx0i" alt="" width="375"><figcaption><p>类型 2</p></figcaption></figure>

如图所示。这个例子就比之前介绍的类型 1 多了一个候选数。不过为了强调推理过程，我换了个颜色把多出来的候选数标注了出来。

如果这两个橘色的 5 从盘面里消失，则 `r38c13` 四个单元格将只剩下 3 和 9。按照之前介绍的思路，由于它会造成唯一矩形的矛盾，因此这种结构应该避免，所以假设就不成立了。

因为我们假设的是 `r8c13 <> 5` 才会导致不成立，所以它的相反情况则是 `r8c13` 里必须有一个是 5。换言之，这两个单元格就会构成一个关于数字 5 的区块结构。所以，所在行和所在宫的其他任何一个单元格都不能填入 5，因为这行和这个宫里填 5 的机会必须从 `r8c13` 里诞生。

所以，这个题的结论就是 `{r7c3, r8c7, r9c1} <> 5`。

我们把这种推理过程称为类型 2，即第二种唯一矩形的推理思路；另外，由于它会用到区块的思路，所以也经常被称为**区块类型**。

## 类型 3（Type 3） <a href="#type-3" id="type-3"></a>

既然有区块，那肯定不能少了数组。我们把使用数组推理的唯一矩形称为**类型 3**（Type 3），也叫**数组类型**。不过数组类型的思路会稍微复杂不少，因为数组有规格一说，所以这个部分会多给大家展示一些例子。

### 显性数组 <a href="#with-naked-subset" id="with-naked-subset"></a>

数组分显隐性，那么唯一矩形里用的时候也分显隐性两种。先来看显性的。

#### 显性数对 <a href="#with-naked-pair" id="with-naked-pair"></a>

<figure><img src="/files/Cm6mSAVy9E5y4YQ6CcgP" alt="" width="375"><figcaption><p>类型 3，带显性数对</p></figcaption></figure>

如图所示，请仔细观察 `r7`。这次和类型 2 又有不同——多出来的两个候选数甚至都不是同一个数字了。不过也没事，推理肯定是可以继续的。

我们优先看到，`r7` 上还有一个空格 `r7c5` 只有 6 和 7，刚好和我们唯一矩形四个格子里多出来的两个候选数是一样的数字。如果我们安排 `r7c5` 填一个数字 6 或 7 进去，由于 `r7c23` 里的 6 和 7 不能同时被去掉（造成唯一矩形的矛盾），所以里面还得再出一个 6 或者 7。虽然我们无法确保 6 和 7 的组合关系究竟如何，但我们可从前面给予的判断条件里知道，`r7` 最终会在 `r7c23` 里选一个单元格，和 `r7c5` 构成关于 6 和 7 的显性数对。

> 你别看 `r7c23` 里的 6 和 7 都只剩下一个候选数了，而标准的显性数对至少需要每个单元格都有两个候选数。但是仔细想想它似乎也没啥毛病：毕竟 `r7c23` 本身哪一个单元格是 6 或 7 我们都确定不了，所以剩下一个候选数也不会有什么问题。所以这里我们只是美其名曰按显性数对的方式给这个结构进行了命名。它当然不是标准的显性数对，只是看起来像，就这么叫它。

我们知道它会在 `r7` 里构成关于 6 和 7 的显性数对就行了，构成的单元格是 `r7c235` 里的其中两个单元格。因为这一行有显性数对，按照显性数对的删数逻辑，它应该删除的是所在行的其他单元格里的 6 和 7，因此本题的结论是 `r7c8 <> 7`，它是这个题里唯一的一个删数。

#### 显性三数组 <a href="#with-naked-triple" id="with-naked-triple"></a>

<figure><img src="/files/CsAsPWNoeiP3a0QhKKXq" alt="" width="375"><figcaption><p>类型 3，带显性三数组</p></figcaption></figure>

如图所示。既然显性数对要用三个单元格的其中两个，那么显性三数组自然就是四个单元格的其中三个。

可以看到，在 `c4` 里有两个单元格总体只能填 1、2、7 三种数字。此时我们发现，这个所谓的 1、2、7，其实也是 `r46c4` 里唯一矩形多出来的候选数。倘若我们让 `r46c4` 不填 1 也不填 7，唯一矩形这四个单元格就会出现矛盾。因此，肯定是需要有 1 或 7 的填入的。

确保这一点后，我们就可以发现，`r59c4` 里只能是 1、2、7 的其二，而 `r46c4` 又需要保证有 1 和 7 的填入，所以呢？所以 `r46c4` 里就会拿出一个单元格填入 1 或者 7，来和 `r59c4` 配成一个整体关于 1、2、7 的显性三数组结构。因此，所在列上的其他任何的单元格都不能填入 1、2、7，于是我们就有结论 `r8c4 <> 1`。

#### 显性四数组 <a href="#with-naked-quadruple" id="with-naked-quadruple"></a>

<figure><img src="/files/LEW46T09xwbz21cCtlfd" alt="" width="375"><figcaption><p>类型 3，带显性四数组</p></figcaption></figure>

如图所示。这次继续把规格推广一个单元格。和前面的思路完全一样，因为我们要保证 `r5c12` 里必须有一个 1 或 7 的填入，而 `r5` 里有三个单元格总体只能填 1、2、6、7，于是他们填 1、2、6、7 的其三，就直接和 `r5c12` 里出现的 1 或者 7 配在一起，形成显性四数组。

因此，`r5` 里的其他空格就不能填 1、2、6、7 了。对于这个题，结论就是 `r5c8 <> 27`。

好了。显性数组的部分就说完了。下面我们来介绍隐性数组的部分。

### 隐性数组 <a href="#with-hidden-subset" id="with-hidden-subset"></a>

隐性数组的思路会稍微绕一些。所以不要走神。

#### 隐性数对 <a href="#with-hidden-pair" id="with-hidden-pair"></a>

<figure><img src="/files/DQjWYvgprk3JS33Fyndn" alt="" width="375"><figcaption><p>类型 3，带隐性数对</p></figcaption></figure>

如图所示。这回我们把思路倒过来。我们看到，`b2` 里数字 1 和 2 只能填在 `r123c6` 三个单元格之中。由于我们不能同时让 `r12c6` 直接是 1 和 2（唯一矩形的矛盾），所以 `r12c6` 里只能二选一。选出来后，和 `r3c6` 就形成了关于 1 和 2 的隐性数对了。

> 有人问，`r12c6` 必须二选一吗？我能都不选吗？看起来唯一矩形的矛盾在都不选的时候也可以避免啊。但是实际上肯定是不能的。因为虽然唯一矩形不矛盾了，但是数字 1 和 2 必须在这三个单元格里选两个单元格填进去，所以你必须确保有两个位置填。都不选就意味着 1 和 2 填不满 `b2`，这直接就矛盾了。
>
> 这里也是和显性数组一样，实际上 `r12c6` 也是确定不了究竟谁是是被选中的格子，但是因为思路非常像是隐性数对，所以美其名曰也叫它隐性数对。

因为有隐性数对的存在，所以 `r12c6` 里有一个格子是 1 或 2，配合 `r3c6` 构成隐性数对。我们能确定的只有 `r3c6`，它必须填 1 或 2。所以，`r3c6 <> 34` 就是这个题的结论了。

这就是带有隐性数组的推理逻辑了。后面的隐性三数组和隐性四数组思路都是大体一致。下面我们来看看。

#### 隐性三数组 <a href="#with-hidden-triple" id="with-hidden-triple"></a>

<figure><img src="/files/IXqgmojFjvLb84zEMgsF" alt="" width="375"><figcaption><p>类型 3，带隐性三数组</p></figcaption></figure>

如图所示，这个题用到了隐性三数组。

看 `c4` 可以发现，数字 1、3、8 整体只能填入到 `r2345c4` 四个单元格里。由于 `r45c4` 里只能有一个格子填 1 或 8，所以 1、3、8 的填数机会还剩下两个单元格；而刚好还剩下两个单元格 `r23c4`。于是，隐性三数组就形成了，即 `r23c4` 里填 1、3、8 的其二，配合 `r45c4` 里选取其中一个格子填上剩下的那个数，三个格子填 1、3、8 三种数字就占满了。

于是，这列其他单元格都不能填 1、3、8，于是我们可以去掉他们。所以这个题的结论就是 `r23c4 <> 9`。

#### 隐性四数组 <a href="#with-hidden-quadruple" id="with-hidden-quadruple"></a>

<figure><img src="/files/UrdfXnCzq8czcNyZaOzA" alt="" width="375"><figcaption><p>类型 3，带隐性四数组</p></figcaption></figure>

如图所示。这个题也是一样。因为 6 和 7 在 `r7c89` 里只能出一个，而 4、6、7、8 四个数字整体在 `r7` 里只能出现在 `r7c12389` 里，所以还剩下三个单元格。刚好三个单元格加 `r7c89` 其一就把四个数的填数机会用完了。因此，这四个单元格（`r7c123` 和 `r7c89` 的其一）形成关于 4、6、7、8 的隐性四数组。所以，这个题的结论就是 `r7c1 <> 39, r7c2 <> 1, r7c3 <> 9` 了。

至此，隐性数组的部分也全部讲完了。

### 类型 3 里的显隐性互补 <a href="#law-of-complement-in-type-3" id="law-of-complement-in-type-3"></a>

不知道你有没有细看这些例子。在唯一矩形里用到的数组其实也是具备显隐性互补的特征的，不过因为它中间用到的空格有一小块是不定的，所以不如直接的数组看起来互补性那么直观。

因为数组一定是有互补的，所以我们就拿前面的其中一个题来给各位介绍一下类型 3 里的互补就行了。其他的就自己看吧。

<figure><img src="/files/3DhDJPTF1h5ZnfWjgBqY" alt=""><figcaption><p>类型 3 的显隐性互补示例</p></figcaption></figure>

如图所示。这是同一个题目，来自于前面的隐性四数组那个题，只是换了一个删数的位置。

可以看到，左边的是关于 1 和 3 的显性数对，右边的是关于 6 和 7 的隐性数对，虽然数字用的不一样，但是结论是一样的，都是 `r9c7 <> 13`。

类型 3 的显隐性互补，你需要先确定显性数组和隐性数组都有哪些单元格是一定固定不动的，然后互补的时候去改变他们的位置。举个例子，对于显性数组来说，因为 `r7c89` 是不确定的，所以固定不变的只有 `r8c7`。隐性数组这边则是 `r9c7` 不变。当需要找互补的数组时，只需要把这个宫（这个例子是宫，别的例子不一定是宫，可以是行或者列，具体情况具体讨论即可）的这部分格子换一下，别的位置都不变，那么我们就能得到另外互补的那一边的数组。这个题因为宫内只有四个空格，除去唯一矩形用了两个单元格，就还剩下两个单元格了，互补过去就只剩一个单元格，所以就是 `r8c7` 和 `r9c7` 他们俩互补。

所有其他的例子也都是一样的道理，这里就不赘述了。有兴趣的话可以自己看看。因为这种互补也是有效的，所以在类型 3 里数组的规格在实际使用上也不会超过 4 个单元格，所以也不存在五数组这种说法，因为也必有互补的另一边比五数组规格更小。

## 类型 4（Type 4） <a href="#type-4" id="type-4"></a>

总算是来到**类型 4**（Type 4）了。类型 4 虽然不如类型 3 有那么多种规格不同的情况（它就一种情况），但是它理解起来也不容易。

<figure><img src="/files/dRTjffOtYgo27rTEA0nN" alt="" width="375"><figcaption><p>类型 4</p></figcaption></figure>

如图所示。我们这次甚至都不要关心多出来几个候选数。我们发现，`r5` 里，数字 2 只能填在唯一矩形用到的 `r5c15` 里。这非常危险：因为 `r5c15` 里必须有一个 2，而上面的 `r4c15` 肯定是 2 和 7 了，所以不管怎么排列 2 和 7 的填数，`r5c15` 都不敢再往其中填 7 了，不然四个格子只有 2 和 7 将直接形成唯一矩形的矛盾。

所以，这个题的结论就是 `r5c15 <> 7`，两边的候选数 7 均需要删除，毕竟 `r5c15` 的随便哪一边是 7，另外一边都必须是 2，因为 `r5` 只能这两个单元格填 2。

我们把这个类型称为类型 4。它用到了一个全新的概念：**共轭对**（Conjugate Pair）。简单来说，共轭对指的是这个 2 只能填入在 `r5c15` 其中，导致“非此即彼”的这种状态。因此，我们把这个类型 4 也称为**共轭对类型**。

在以后的内容里，我们还会学到链技巧，链的概念里会出现一个术语叫“强链”，从使用上来讲，是共轭对的超集，即所有的共轭对都是强链的最常见的形态，所以共轭对类型也常被称为**强链类型**。但是因为这里使用的术语超纲了，所以我们就不拓展这部分的内容了，还是暂时使用类型 4 或共轭对类型称呼此技巧。

## 类型 5（Type 5） <a href="#type-5" id="type-5"></a>

前面介绍了类型 2、3、4 几乎已经是全部常见用法了。下面给各位介绍的是针对于前面类型 2、3、4 本身推理上的推广。

<figure><img src="/files/oJqLYx5UQdnVETjbXa7g" alt="" width="375"><figcaption><p>类型 5</p></figcaption></figure>

如图所示。它是类型 2 的推广。类型 2 里有两个单元格里多出同一个数字，因此他们会构成区块。这次有三个单元格都多出一个数字，因此结论就是他们仨不能同时从盘面里消失。

既然这三个候选数 3 都不能同时消失的话，那么就说明他们里面至少有一个是对的。注意，这次只能说至少有一个了。因为我们很明显可以看出来，`r3c1` 和 `r9c3` 是可以同时填 3 的，也没有明显的矛盾，但是这并没有什么特殊意义，它并不影响我们后续的推理，这里只用得上“至少一个”这么个说法。

当我们知道至少有一个的时候，那么我们就去找和 XYZ-Wing 那样的删数位置——填一个 3 使得这三处位置全不能填 3。这题还真有，就是这里的 `r8c1(3)` 了。所以，`r8c1 <> 3` 是这个题的结论。

我们把这种推广类型 2 的模式称为**类型 5**。不过，类型 5 也不一定非得是三个单元格构成。因为，就两个单元格多出来一个数字也是 OK 的，只是它得斜着摆，这种情况特别罕见。

<figure><img src="/files/RZQ4LCEWyc9BOBIJQIp8" alt="" width="375"><figcaption><p>类型 5，另一种摆放模式</p></figcaption></figure>

如图所示。这种情况也是属于类型 5 的。总而言之，只要让类型 2 里多出来的数字摆放位置存在斜着的情况的时候，就称为类型 5。

## 类型 6（Type 6） <a href="#type-6" id="type-6"></a>

下面我们来看类型 4 的推广。类型 4 一共具有两种推广，不过有一种推广是没有名字的，也就是这里的**类型 6**（Type 6），另外一种有一个单独的技巧名。先来说类型 6 这个没有名字的情况。

<figure><img src="/files/w6TF6GRx4vGCiWXlq7GS" alt="" width="375"><figcaption><p>类型 6</p></figcaption></figure>

如图所示。类型 6 是把共轭对类型的一个共轭对推广成了两个。因为这个思路稍微有些不够直接，所以需要严格地梳理一下逻辑。

我们可以看到，数字 4 有两处共轭对，且恰好位于 `r46` 上，还恰好两个共轭对用到的格子刚好就是唯一矩形用到的四个单元格。这意味着，这四个单元格里必须出现两个 4。

由于 `r4c7` 和 `r6c3` 只有两个候选数 4 和 9，所以这两个单元格显然填不了别的数字。结合共轭对我们可以得到的信息是，如果 `r4c3` 填 4 或者 `r6c7` 填 4 就会引发唯一矩形的矛盾。举个例子，如果 `r4c3 = 4`，则 `r4c7` 和 `r6c3` 因为只有 4 和 9 的关系，他们俩就只能填 9。于是乎，`r6` 的共轭对的关系会直接导致 4 填在 `r6c7` 里，然后就形成了 4 和 9 的唯一矩形的矛盾；同理，从 `r6c7 = 4` 出发，我们也可以得到 `r6c3` 和 `r4c7` 填 9 的结果，于是，由于 `r4` 的共轭对，导致 `r4c3 = 4`，于是也形成了矛盾。

所以，这个题的结论是 `{r4c3, r6c7} <> 4`。

我们把这种类型称为类型 6。

什么样的题属于类型 6 呢？两个共轭对，用到同一个数字，且构成平行的状态。我们再来看一个例子。

<figure><img src="/files/C9xQ9yGl4B2s1igeZ8P5" alt="" width="375"><figcaption><p>类型 6，另一个例子</p></figcaption></figure>

这个题就自己看了。

## 隐性唯一矩形（Hidden Unique Rectangle） <a href="#hidden-unique-rectangle" id="hidden-unique-rectangle"></a>

下面介绍最后一种情况，也是两个共轭对，也是相同的数字的共轭对，但是是垂直的。

<figure><img src="/files/fOoh3gaIgOgk6xAa9s8I" alt="" width="375"><figcaption><p>隐性唯一矩形</p></figcaption></figure>

如图所示，这次共轭对是垂直摆放的，所以有些别扭，因为不方便我们讨论填数情况。这次我们换个思路。

因为两个垂直的共轭对用到了三个不同的候选数 5，所以他在内部的可填情况只有两种：

* `r9c5 = 5`；
* `r7c5 = 5` 和 `r9c7 = 5`。

没有其他情况了。显然，`r7c5` 和 `r9c7` 是必须同时填 5 的，不能只填一个。因为这两个共轭对要求 `c5` 和 `r9` 都得有填 5 的情况，只填一个就会使得其中一个行列上没填 5 直接出错。

当我们确定有这两种情况后，我们可以直接进行推理：

* 如果 `r9c5 = 5`，则因为它填上了数字，所以占位使得 `r9c5 <> 9`；
* 如果 `r7c5` 和 `r9c7` 同时填 5，则因为 `r7c7` 只有 5 和 9 两种候选数，因此它此时必须填 9；而另一边，`r9c5` 如果此时填 9 就会使得四个单元格只有 5 和 9，出现唯一矩形的矛盾，所以也可以得到结论 `r9c5 <> 9`。

显然，不论两种情况的哪一种，我们都可以得到 `r9c5 <> 9`，所以 `r9c5 <> 9` 是正确的结论。

我们把这种摆放是垂直的情况称为**隐性唯一矩形**（Hidden Unique Rectangle，简称 HUR）。

> 隐性唯一矩形在一些地方也称为类型 7，但是因为唯一矩形在类型编号上对于类型 7 是否纳入正式类型并没有一个统一标准，所以这里就不纳入进来了，毕竟它有一个单独的技巧名。

我们再来看一则例子。

<figure><img src="/files/xGuAq6CTAFV6Z1eOpOKQ" alt="" width="375"><figcaption><p>隐性唯一矩形，另一个例子</p></figcaption></figure>

这个例子就自己推理了。方法大概和前面是一样的，只是位置不一样。

至此，我们就把全部的唯一矩形的类型（有编号的类型）全部介绍完毕了。实际上，唯一矩形的内容并没有完整结束，但是它的一些复杂用法就放在以后说了。


# 残缺唯一矩形

Incomplete Unique Rectangle

前面的内容我们介绍了唯一矩形的一些常见推理思路，搭配了区块、数组和共轭对三种不同的逻辑，产生了一共有 6 种不同的用法。

由于唯一矩形也拥有残缺状态，所以本文将对前面的类型展示各种残缺状态的唯一矩形。每一个例子都希望你自己推理，不过我也会给予一小部分提示文字或必要的信息帮助你理解它。

## 类型 1 <a href="#type-1" id="type-1"></a>

先来看残缺的类型 1（标准的类型）。这个类型在解释唯一矩形存在残缺为什么推理仍然有效的那一部分内容里已经展示过一个例子了，不过这里还是继续展示一下。

<figure><img src="/files/HRPYRstXht2gS1JxVUo1" alt="" width="375"><figcaption><p>残缺类型 1</p></figcaption></figure>

如图所示。可以明显发现，删数少了一个数。因为唯一矩形的基本推理需要三个格子都有两个候选数，显然他们是不能残缺的（不然就成唯一余数了），所以只能残缺到删数上去。

但是，我们之前说过，残缺不影响推理，因为这些缺少的候选数在唯一矩形里奏效的本质原因是，他们可以被补回去，毕竟唯一矩形是“形成了闭环”的，这使得它删除的候选数必定是之前遇到过的候选数、初盘肯定存在的候选数。

这题缺少了候选数 `r3c4(2)`，补回去后就是标准的类型。

## 类型 2 <a href="#type-2" id="type-2"></a>

<figure><img src="/files/AMIzKzvLBF0ZYV8nLL9Y" alt="" width="375"><figcaption><p>残缺类型 2</p></figcaption></figure>

如图所示。这题残缺的数字是 `r3c8(5)`。

## 类型 3 <a href="#type-3" id="type-3"></a>

<figure><img src="/files/7qcJK9VoPMB4Ckw2rYT9" alt="" width="375"><figcaption><p>残缺类型 3（显性数组）</p></figcaption></figure>

如图所示。这题缺少的数字是 `r1c2(6)`。

## 类型 4 <a href="#type-4" id="type-4"></a>

<figure><img src="/files/uri3ADzcvjZETIsKbILM" alt="" width="375"><figcaption><p>残缺类型 4</p></figcaption></figure>

如图所示。这题缺少的候选数是 `r6c6(9)`。和类型 1 一样，也是缺少一个删数。

不过这题稍微特殊一些，因为缺少了一个删数后，9 似乎看起来就只能有一处合理的摆放了，无法形成唯一矩形后续的“交换态”，就无法产生两种填法。实际上这些都不是问题，因为 9 是可以补回去的，所以补回去仍然有两个地方可填 9。它只是因为被我们提前删掉看起来不能交换而已。

## 类型 5 <a href="#type-5" id="type-5"></a>

<figure><img src="/files/EEgIFjpzXYtLTiW3SPUB" alt="" width="375"><figcaption><p>残缺类型 5</p></figcaption></figure>

如图所示。这题缺少的数字是 `r7c3(5)`。

## 类型 6 <a href="#type-6" id="type-6"></a>

类型 6 由于主要依赖的是共轭对，所以缺少的数字可以多一个。

<figure><img src="/files/E4d2VgEnlWcSFJsBgQOw" alt="" width="375"><figcaption><p>残缺类型 6（面目全非版）</p></figcaption></figure>

如图所示。这题缺少的数字是 `{r3c9, r6c7}(8)`。这题缺了两个数字仍然不影响推理，我们来看看为什么。

因为我们起始点假设的是 `r3c9(3)` 或 `r6c7(3)`，所以可以直接得到的是 `r3c7 = 8` 和 `r6c9 = 8` 的结果。而因为此时 3 在 `r36` 都是共轭对的关系，此时剩下的一处单元格（如果 `r3c9 = 3` 是假设，那么剩下的就是 `r6c7`，反之亦然）必然因为共轭对的关系填入 3。此时，3 和 8 就会构成唯一矩形的矛盾。

可以从这个推理过程之中看出，它实际上连缺少的 8 都用不到。真要说用到没有，其实也是用到了，但是是在后面产生唯一矩形的矛盾的时候才需要补回去；中间产生 3 和 8 填数的过程是完全用不到的。

这便是类型 6 的神奇之处。

## 隐性唯一矩形 <a href="#hidden-unique-rectangle" id="hidden-unique-rectangle"></a>

<figure><img src="/files/fWavMCu6veG6AQaESCIb" alt="" width="375"><figcaption><p>残缺隐性唯一矩形</p></figcaption></figure>

如图所示。这个题也因为用到两个共轭对，所以少了两个候选数：`{r2c9, r3c6}(3)`。

我们也是和前面一样，先讨论共轭对的摆放。可以看到，由于共轭对是垂直的，所以它只有两种填法：

* `r3c9` 填 2；
* `r2c9` 和 `r3c6` 同时填 2。

如果是第一种情况，则可以直接因为占位而删除 `r3c9(3)`；而如果是第二种情况，则因为 `r2c6` 只有 2 和 3 的关系，所以它只能填 2，然后为了规避唯一矩形产生矛盾，所以仍然可以得到 `r3c9 <> 3`。

所以这个题的结论在残缺状态下仍然是可以得到的：`r3c9 <> 3`。


# 可规避矩形（AR）

Avoidable Rectangle

## 类型 1 <a href="#type-1" id="type-1"></a>

<figure><img src="/files/p8GFUPnJi6pzxWHEXChB" alt="" width="375"><figcaption><p>类型 1</p></figcaption></figure>

如图所示。我们仍旧关注于唯一矩形那种摆放形式的四个单元格，不过这次我们不看空格，而是把视角聚焦于填入数里。

这次，`r78c59` 里其中三个单元格都填了数字 4 或 9，只有一个是空格。假设我们让 `r7c9 = 4`，则我们会发现四个单元格已经填成 4 和 9 的类似唯一矩形的矛盾填数状态。不过，这次是已经填好了数字，那么它能否出现矛盾呢？

实际上也是可以的。我们之前在残缺的那一讲内容里提到过，残缺的唯一矩形不影响推理，因为实际缺少的候选数由于唯一矩形的摆放方式，是可以补回去的，它不外乎是提前被我们删除掉了而已。而对于上面给的这个题而言，虽然它已经填上数字，而它由于是填入数的关系，它自始至终都不是题目最开始就拥有的数字，因此这几个单元格你仍旧可以当成空格，只是说空格是唯一余数，比如说我们可以将 `r7c5 = 9` 看作是 `r7c5` 仅有 9 这一个候选数，这个意思。

当有了这层铺垫后，我们就可以填回原本去掉的候选数了。例如，`r7c5(4)` 在题目最开始的时候也是存在的，我们仍旧可以补回去；而 `r8c5` 和 `r8c9` 同理。当补回候选数后，这个结构就恢复回了一个标准版的唯一矩形。

因为要规避矛盾，所以 `r7c9 <> 4` 此时就成立。因此，就算是填入数的状态下，这个结论仍旧成立。

我们把这种使用填入数而非空格的唯一矩形推理思路称为**可规避矩形**（Avoidable Rectangle，简称 AR）。它和唯一矩形同源，但因为长相比较特殊所以有它自己单独的技巧名称。

由于它恢复候选数后可转换回唯一矩形的类型 1，因此我们把这个结构称为可规避矩形的类型 1。

下面我们来看看可规避矩形的其他类型。

## 类型 2 <a href="#type-2" id="type-2"></a>

<figure><img src="/files/SfzVO73iRsBcgZOUtYqc" alt="" width="375"><figcaption><p>类型 2</p></figcaption></figure>

如图所示。这次我们使用的是单元格 `r15c23`，其中有两个单元格已经有填数。

显然，`r1c23(7)` 不能同时从盘面里消失，否则它俩会变为唯一余数，然后形成矛盾，因此这两个橘色的 7 将会形成区块结构，于是，所在宫和所在行的其他单元格都不能填入第二次 7 了，所以这个题的结论就是 `{r1c89, r2c23} <> 7`。

我们把这个结构称为类型 2。因为它在补回候选数后类似于唯一矩形的类型 2（区块类型）。

## 类型 3 <a href="#type-3" id="type-3"></a>

<figure><img src="/files/CDDqsVAAIWSuj93c8RTO" alt="" width="375"><figcaption><p>类型 3</p></figcaption></figure>

如图所示。如果我们让 `r89c9` 里所有三个橘色的候选数全部从盘面里消失的话，`r89c59` 将会形成矛盾。而由于所在宫里有一个单元格 `r8c8` 只有橘色的 1 和 4 这两种候选数，因此在 `r89c9` 里必须要拿出一个单元格与之配对形成显性数对，于是乎我们就知道，这个宫里其余的单元格就没有机会填入 1 或 4 了。因此这个题的结论就是 `r7c9 <> 4`。

我们把这个用法称为类型 3。我们再来看一个例子。

<figure><img src="/files/ElVhEfmzIgLQaa8OhAZ0" alt="" width="375"><figcaption><p>类型 3，另外一个例子</p></figcaption></figure>

如图所示。这个题就自己推理了吧。

## 类型 5 <a href="#type-5" id="type-5"></a>

接下来我们直接跳过类型 4，来看类型 5。原因我一会儿再说。

<figure><img src="/files/XdN53RZryoLUlfuRs7Du" alt="" width="375"><figcaption><p>类型 5</p></figcaption></figure>

如图所示。这个长相怪异的结构是类型 5。

如果我们让 `r3c7` 和 `r5c9` 里的候选数 3 同时从盘面里消失，那么就会直接得到 `r3c7` 和 `r5c9` 填 9 的结论，于是，`r5c7` 就只能填 7，于是四个单元格 `r35c79` 就会形成矛盾。

所以，`r3c7` 和 `r5c9` 里的候选数 3 至少有一个是正确的填数。那么使用类似 XY-Wing 的删数逻辑，我们可以得到 `r1c9` 和 `r6c7` 是可以同时影响到这两个 3 的位置，于是这个题的结论就是 `{r1c9, r6c7} <> 3` 了。

## 隐性可规避矩形（Hidden Avoidable Rectangle） <a href="#hidden-avoidable-rectangle" id="hidden-avoidable-rectangle"></a>

和前面一样，我们跳过类型 6，直接来看可规避矩形版本的隐性唯一矩形。

<figure><img src="/files/gTLW24vx1hZCwZnxAGqt" alt="" width="375"><figcaption><p>隐性可规避矩形</p></figcaption></figure>

如图所示。我们可以看到，图中 `r2` 和 `c4` 都存在 4 的共轭对。所以，和隐性唯一矩形一样，我们按摆放分两种情况进行讨论。

* 如果 `r2c4 = 4`，则因为 `r2c4` 占位可以得到 `r2c4 <> 8`；
* 如果 `r2c1` 和 `r3c4` 同时填 4，则为了规避出现矛盾，`r2c4 <> 8` 也是成立的。

所以，我们有 `r2c4 <> 8` 的结论。我们把这个用法称为**隐性可规避矩形**（Hidden Avoidable Rectangle，简称 HAR）。

## 为什么不讲类型 4、6？ <a href="#why-there-is-no-type-4-and-6" id="why-there-is-no-type-4-and-6"></a>

下面我们把话题回到前面漏掉的类型 4、6。为什么跳过了他们？

原因其实很简单：因为不存在。可规避矩形的世界里并不存在类型 4 和类型 6。你可以试着把类型 4、6 的共轭对标注出来，然后试着看看它的可规避矩形版本，填入数都可以放在哪里。

对于类型 4 而言，因为其中有两个单元格需要使用共轭对，所以它俩是不能有填入数的存在的。所以填入数只能放在剩下的两个单元格里。但是，一旦放进去之后，另外一边因为数对的关系很容易确定下来。假设这两个填数是 $$a$$ 和 $$b$$，那么根据类型 4，共轭对用到的数字也必须是 $$a$$ 或 $$b$$ 的其中一个。但是因为填数已经填有 $$a$$ 和 $$b$$，所以我们无论如何都构造不出这个共轭对（共轭对的单元格一定和这两个填数的位置是同行列的）。所以，类型 4 在可规避矩形的世界里并不存在。

而对于类型 6 而言就更容易说明清楚了：因为类型 6 四个单元格都会被两个共轭对占用，所以根本无法往里放入任何的填入数。所以，类型 6 也不存在可规避矩形的版本。


# 唯一环（UL）

Unique Loop

下面我们来看两种基于唯一矩形形式，从数字和结构两种方面拓展的新技巧。先看第一种。


# 唯一环的基本推理

Reasoning of Unique Loop

## 类型 1 <a href="#type-1" id="type-1"></a>

<figure><img src="/files/Ww7CxbRtVvRkucJrAIPb" alt="" width="375"><figcaption><p>类型 1</p></figcaption></figure>

如图所示。我们把唯一矩形的结构从 4 个单元格拓展到 6 个单元格，但是思路没有多大的变化。

假设我们让其中的 `r1c9(4)` 不存在，则它也会只剩下 2 和 9，于是按照图中的环线按次序填数。可以看到，环线上每相邻的两个单元格都是同行、同列或者同宫的，因此相邻的单元格肯定不能填入相同的数字；其次，因为是 6 个单元格，是偶数个单元格，也就意味着我们填满全部的单元格后，2 和 9 会交替形成环状填数结构，而不会出现两个相邻单元格最终填数一样的情况。

这是这个推理的核心点。因为它会构成关于 2 和 9 的交替填数模式，所以它不会自动出现矛盾；正是因为这点，我们可以将这 6 个单元格里，所有填入 2 的位置都改成 9，而所有填 9 的位置又改成 2。这样我们就可以得到第二种填法。

和唯一矩形的思路一样，当我们填充了这些 2 和 9 后，由于结构的特殊性，所有用到的 9 个区域（即 `r123`、`c159` 和 `b123`）在未填写数字前，都有 2 和 9 的显性数对结构。因此内部填入 2 和 9 并不会改变本身显性数对所产生的结论（所在行列宫的别处都不能填 2 或 9）；而别处其他的空格也都不会因为 2 和 9 的填写而产生任何的影响。

这一点很重要，它和唯一矩形除了规格上不同，其他地方则完全一样。得到这一点后我们就可以知道，这个结构它也能形成和唯一矩形一样的两种填法，而不影响盘面任何其他的地方的候选数的变动，所以，这种结构也可以形成那种矛盾。就像这样：

<figure><img src="/files/YmRTfg2UcIRkF3ocAZcj" alt=""><figcaption><p>产生矛盾的两种填法</p></figcaption></figure>

于是，假设就并不成立。我们最初的假设是让 `r1c9(4)` 不存在（换言之就是 `r1c9` 只保留 2 或 9 两个候选数）。既然它不对，那么对的结论就自然是 `r1c9 <> 29` 了。所以，这便是这个技巧可以得到的结论。

我们把这个结构称为**唯一环**（Unique Loop，简称 UL），即唯一矩形从结构上的推广；而由于它和唯一矩形类型 1 非常相似，所以我们把这个结构称为唯一环的类型 1。

下面我们来看下类型 2、3、4。

## 类型 2 <a href="#type-2" id="type-2"></a>

<figure><img src="/files/AppHqPdbB9earFAkKo9G" alt="" width="375"><figcaption><p>类型 2</p></figcaption></figure>

如图所示。因为本身唯一环结构用的格子就先天比唯一矩形要多，所以唯一环就不分所谓类型 2 还是类型 5 了，统统都归纳在类型 2 里。

假设橘色的三个候选数 7 全部从盘面里消失，则 6 个单元格将只剩下 8 和 9 两种候选数，因为前文对其简要说明过它是会矛盾的，所以这里我就省略过程了。

由于它会形成矛盾，所以三个橘色的 7 不能全部消失；换言之就是说至少有一个是正确的填数。那么，我们可以得到的是 `r2c9 <> 7` 的结论——只有这个位置进行假设填入会同时让三处 7 全部消失。

我们把这个用法称为唯一环的类型 2。

## 类型 3 <a href="#type-3" id="type-3"></a>

### 标准摆放 <a href="#standard-subtype" id="standard-subtype"></a>

<figure><img src="/files/qdbNLKCT4rlaaibhypRg" alt="" width="375"><figcaption><p>类型 3</p></figcaption></figure>

如图所示。`r1c3(5)` 和 `r2c3(25)` 三个候选数不能同时从盘面里消失，否则会出现矛盾。所以我们只能拿出其中一个数，和 `r8c3` 搭配起来构成显性数对。

所以这个题的结论就是，`c3` 会形成显性数对，删除掉 `r6c3(2)`。

这个就是类型 3 的用法。

### 特殊摆放 <a href="#special-subtype" id="special-subtype"></a>

和前面的例子不同，我这里补充一个比较奇怪的例子。因为毕竟是唯一环，所以它产生的和唯一矩形使用同一侧的两个单元格的这种摆放方式会有所不同。

<figure><img src="/files/D6ElmY9VS6pD9r8IFORW" alt="" width="375"><figcaption><p>类型 3，另一种摆放方式</p></figcaption></figure>

如图所示。这个图里的 1 和 7 作为额外数字出现，会和 `r9c3` 构成显性数对。不过这个地方要注意的是，它一连同时借用了两个格子 `r8c3` 和 `r9c5`。这很显然，它俩并不在同一个行、列、宫，因此我们无法知晓它俩填入 1 和 7 的状态；但是，我们可以借用 `r9c3` 得知这一点。

显然，`r8c3` 和 `r9c5` 是不可能同时填入 6 和 9 的，因为它会直接造成整个唯一环的环路上只有 6 和 9，出现矛盾；而又因为 `r9c3` 只能填 1 或 7，所以 `r8c3` 和 `r9c5` 势必会有至少一个单元格填 1 或者 7 的另外一个数。

所以总体情况就是，`r8c3` 和 `r9c5` 不论有一个格子填 1 或 7，还是都填 1 或 7，总归会有一个数和 `r9c3` 填的数形成显性数对。如果 `r8c3` 填了，那么 `r89c3` 就会构成数对；如果是 `r9c5` 填了，那么 `r9c35` 就会构成数对。反正都有数对，所以 `r9c2` 自然就不可能是 1 或 7，因为这俩数对都能删这个单元格填的 1 或 7。所以，这次我们的结论是 `r9c2 <> 7`。

## 类型 4 <a href="#type-4" id="type-4"></a>

<figure><img src="/files/MHDw9KmB38ATLuw15kf5" alt="" width="375"><figcaption><p>类型 4</p></figcaption></figure>

如图所示。我们发现 `b3` 里存在关于 2 的共轭对，且恰好在结构用到的其中两个单元格上。

如果我们尝试往这两个单元格的其中任意一个填入 7，则沿着环线绕一圈得到 2 和 7 的填数。最终 `r12c8` 起始假设的另外一边因为 2 的共轭对的关系，必须填 2，于是就会出现矛盾。

所以这个题的结论就是 `r12c8 <> 7`。我们把这个称为类型 4。

鉴于结构的特殊性，唯一环也就不分什么类型 6 和隐性唯一环了。所以到这里就说完了唯一环的四种情况。


# 唯一环的形成条件

Condition of Forming Unique Loop

前面的内容我们简单说明了唯一环的四种基础类型。为了更好帮助你阅读后面规格推广的其他情况，我们这里给各位介绍一下唯一环的一些需要解答的、比较难思考的问题。

## 简单的思考 <a href="#consideration-on-condition" id="consideration-on-condition"></a>

前文我们给各位展示了四个类型。但是前三个例子都是在并排的三个宫里，而只有类型 4 的 6 个格子相隔会比较远一些。

这不免会让我们引起怀疑：这样的结构到底有什么形成条件？或者换句话，唯一环到底需要满足什么样的条件，环才能形成并引发矛盾，才能使用类型 1 到 4 的各种推理逻辑得到正确的结论。

首先，它得是偶数个单元格构成。这肯定是必需的。

其次，它需要让结构形成一个完整的闭环。所谓的闭环，指的是结构的所在行、列、宫不能有任何一个区域遗漏，即结构用到的格子分配到每一个出现的区域的时候，有一个或一些区域上只有一个单元格。这种摆明了就是放的时候填不同的数就会直接造成不同的影响。

第三，摆放的时候需要规避内部出现填数的矛盾。这看起来是一句废话。实际上唯一环要形成闭环，即使你用到的格子数是偶数个，它仍然会出现内部矛盾。

下面我们针对于这三点说明一下。

### 基础条件：闭环和行列宫数量均等 <a href="#basic-condition" id="basic-condition"></a>

先是一个基础条件。

**唯一环必须要使用偶数个单元格（假设有** $$2n$$ **个单元格），两两同行列宫相连形成闭环，且整体结构用到** $$n$$ **个行、**$$n$$ **个列和** $$n$$ **个宫。**

前面的部分比较好理解。重点是最后这部分必须 $$n$$ 个行列宫怎么来的。

你可以仔细对比前面介绍的题，就可以明显发现到，因为结构内部使用的是显性数对，所以一个区域下只能有两个单元格。

我们从唯一矩形的 4 个单元格入手思考。我们每次拓展两个新的单元格到结构里，不管形不形成闭环，但因为加的两个单元格本身会形成显性数对，所以它必须是单独的一个区域的两个格子，而不能是前面四个格子用到的行列宫。

一个唯一矩形用到 2 个行、2 个列和 2 个宫。当我们需要扩展结构时，我们需要拿掉唯一矩形的其中一个“角”，然后将其从外部拓展出两个单元格并嵌入结构里，最后再加一个格子构成闭环回路。

这里解释一下这个说法。所谓的“拿掉”，是为了去取消唯一矩形的闭环。拿掉哪一个无所谓，这里是讨论其理论构造，所以四个单元格拿掉哪一个其实都是一样的。如图所示：

<figure><img src="/files/KrmeY6m0HusN6GEIW48X" alt="" width="375"><figcaption><p>示意图 1</p></figcaption></figure>

然后，拿掉其中一个位置。比如这个 `r2c7`。

<figure><img src="/files/VqTrSG5ezDv9AUbmTIDX" alt="" width="375"><figcaption><p>示意图 2</p></figcaption></figure>

由于我们拿掉了其中的一个单元格，而它一定会有两个单元格和它成边，如图里画出来的这两条边的连接。

那么，我们此时要干嘛呢？构成更大的闭环。所以我们需要找两个单元格，一边连一个。对这个结构而言，因为 `r1c7` 和 `r2c3` 分别在 `c7` 和 `r2` 上都只有一个格子了，于是我们需要在这俩区域下追加新的单元格。

比如，我们把格子加在 `r7c7` 和 `r2c9` 上。

<figure><img src="/files/zgFKivKfEMMcGaDHSA2T" alt="" width="375"><figcaption><p>示意图 3</p></figcaption></figure>

如图所示。好了。我们发现，因为补充的两个单元格他们互相虽然没有啥关系，但是他们摆在结构里就立刻规避了裸露出来的 `r1c7` 和 `r2c3`。此时，新添加的这两个单元格便需要闭环回去。

这很好加了。我们只需要找到 `r7c9` 即可。这一个单元格一旦加上去，两边的单元格都能形成闭环。于是，加上 `r7c9`。我们一共加上三个单元格，去掉原有的一个单元格，最终 6 个单元格就能形成新的闭环：

<figure><img src="/files/Em83XtCJqlS0GUHjrKB2" alt="" width="375"><figcaption><p>示意图 4</p></figcaption></figure>

这样，唯一环就形成了。

而回顾一下刚才我们添加的逻辑。我们挖去了唯一矩形的其中一个角，然后加了三个格子。其中先加了两个格子在暴露出来的两个位置上，然后再加一个强行让新加入的两个单元格在结构里成为闭环。

所以总的步骤有三个：删除一个格子，多补充两个格子，最后再补充一个格子。删除一个格子会去掉一个行或列；而我们新加入的格子又会补回缺少行列的数量，最后形成闭环后，行列宫都会新增一个。注意，`r7c9` 这里和 `r7c7` 是刚好既在同一个行上，又在同一个宫里的。这里宫的计算别漏了。

所以，整个流程会新增一个行、一个列和一个宫。从原始唯一矩形入手我们就知道它本身使用的行列宫的数量就是一致的。那么每次新增加两个单元格，那么就会新增一个行、一个列和一个宫，数量仍然会保持一致。就这么一直延续下去，始终的行列宫数量都是一样的。

可以从补格子的逻辑上看出，这似乎只是一种补充方式。如果我们还在 `b123` 里选格子的话，那么补够 6 个单元格所导致的最终效果其实是一样的，不过这里就不赘述了。

这就是我想说的第一点。

### 特殊条件：无解规避 <a href="#special-condition" id="special-condition"></a>

在这个补充过程之中，我们难免会遇到一种构造。它只会在 8 个单元格或以上的时候存在，所以这个问题比较难以想到。

考虑一个 8 个单元格的闭环：

<figure><img src="/files/meDY0EOCcTT2n0drCWEL" alt="" width="375"><figcaption><p>8 个单元格的闭环</p></figcaption></figure>

如图所示。这只是 8 个单元格形成闭环的其中一种特殊摆放形式。不是说 8 个单元格必须摆成这样。这里要拿这个特殊摆放形式举例。

这个摆放你认为它形成闭环的方式是什么呢？还能只用行和列吗？似乎不行。如果只用行列连线的话，看起来就会有两个闭环了：

<figure><img src="/files/yQoFK1FVaJkjqRA3Mk0z" alt="" width="375"><figcaption><p>8 个单元格的闭环的连线（错误）</p></figcaption></figure>

这肯定是不对的。因为两个闭环两两是相邻了，但它没有考虑到宫内连接的关系，因此被拆成了两个闭环。我们要用闭环，本质是为了让两两单元格相邻关联起来。图上这样并不会把所有 8 个单元格都关联起来——它只会一次关联 4 个。

所以正确的连法是什么样的呢？这里要用宫的连接方式了。当然，它也不是唯一的连法，这里画一种：

<figure><img src="/files/T25h7B9wl2pcZoTXe6y5" alt="" width="375"><figcaption><p>8 个单元格的闭环的连线（正确）</p></figcaption></figure>

这样就可以两两相邻的单元格配对连线成闭环了，而且也满足前面的基础条件限制（8 个单元格，用到 4 个行、4 个列和 4 个宫）。

不过，说这个是干嘛呢？说这个是告诉各位，8 个单元格开始，这种结构会有一个特殊现象。我们尝试把其中一个宫里的两个单元格给扭转一下。例如 `b1`，我们把 `r1c1` 和 `r3c3` 改成 `r1c3` 和 `r3c1`。这样扭转一下。

<figure><img src="/files/vutXcqGEzaQ9Cprw1M6c" alt="" width="375"><figcaption><p>扭转后的 8 个单元格</p></figcaption></figure>

这样扭转不会改变用的行列宫的数量。因为它横纵并未发生变化；而扭转也不会超出宫的范畴，所以宫的数量也不变。不过，连线会稍微变一下。

<figure><img src="/files/eZ79XmPY322Id0qk0ZAt" alt="" width="375"><figcaption><p>扭转后的 8 个单元格的闭环连线</p></figcaption></figure>

看起来甚至都不用宫的连接了。这似乎也没毛病。

所以，它同时也满足我们刚才的闭环，偶数个单元格以及出现行列宫数量均等这些条件。那么它是唯一环了吗？

不是。它不是唯一环。实际上，你在假设内部填数后会发现，这个结构在内部会直接出现矛盾。这点稍微麻烦一些，需要你手动尝试填数并得出矛盾。

尝试在盘面的这些单元格里按照我们找出的这个闭环按照两种不同的颜色进行交替涂色。如果我们能发现，图中仍存在一对单元格（两个单元格）同在一个行列宫里，却具有相同涂色时，我们就可以认为这种画法是无解的。

为了不牵扯到复杂的图论知识，这里我尽量不使用图论的说法来给各位解释。先举个例子。前面的两种结构下，按照我们给定的闭环路径进行两种颜色的交替涂色，我们可以看到，这两个结构里，后者确实会存在问题：

<figure><img src="/files/9gPj61Hax9CqPH8B73uZ" alt=""><figcaption><p>两种结构的涂色结果</p></figcaption></figure>

如图所示。左图是之前的那个画法。我们发现，它怎么看都没有问题；但是右图却存在问题：虽然连线我们保证了交替涂色，但是在同一个宫里，却有相同的涂色。

如果你还没有明白涂色的本质含义的话，那我不妨说得更直白一些。这里的两种颜色的涂色就意味着唯一环里填入的那两种数字。交替涂色的本质也就是交替地填入唯一环用到的两种不同的数。涂色的不同意味着填数的不同；涂色相同也就意味着填数的一致。那么我们可以看出，左图在任何地方都没有任何问题，哪怕是在宫里尚未直接相连的部分（如 `b1` 里的两个单元格 `r1c1` 和 `r3c3`），涂色都是不同的。这不会造成冲突；但是右图会引发问题：交替涂色后，所有四个宫内，涂色都是完全一样的。

我们严格要求涂色不相同，哪怕宫里这种不在连接闭环上的路径也不允许有相同的涂色，主要是为了保证最终填数在任意的行列宫都不会造成填数的矛盾。而显然右图他不满足这一点，因此，右图并不能称为唯一环。

这便是为什么，扭转了一个宫的情况，唯一环就不再成立的原因。

这里我需要补充一句。可能细心的读者会察觉到一个问题。似乎我并未严格从某一个单元格开始假设，这是否会影响到最终填充颜色和矛盾的造成。其实是不影响的。这一点可以由唯一环本身的基础定义保证。它必须是偶数个单元格构成，这意味着相邻的单元格按照沿线涂色，那么必定只能不相同。所以你最终能涂出来的，只可能有两种情况：和我完全一样，以及和我上图给出的涂色完全相反（绿的变黄，黄的变绿）。

而颜色完全相反的情况，和颜色完全一致的情况显然是从同一个填法所派生出来的两种填数模式，因为本质上只是把数字给换了一下，但在假设期间，我们并不知道具体填的是多少，所以填哪一个数作为第一种情况都行，只要我们知道换一个颜色就表示的是第二种情况即可。

而很明显的是，由于唯一环是不区分方向的，所以你可以沿着路径顺时针走一圈，也可以逆时针走一圈；你也可以从绿色的单元格开始，也可以从黄色的单元格开始。但不论你怎么开始，最终映射出来的填数情况也只会从前文描述出来的这同一种填法派生而来。所以，你任意从哪里假设都没有问题。就哪怕右图这种导致矛盾的情况，也只可能会产生出两种配色方案，其中另外一种方案则和我图上这个的配色完全相反。别无其他情况。

当然，这里有一丢丢不严谨。唯一环要想这么假设，它显然需要依赖一个规则，就是唯一环必须只存在一种这种闭环的画法。但是不难看出，左图这种唯一环其实是有按中心对称的另外一种连接闭环回路的。这也暗示了唯一环并不一定总是只有唯一的一种连接路径。但这并不妨碍什么。还记得我们最开始提到的错误唯一环连接方法吗？错误的连接把唯一环拆解为了两个闭环，每一个闭环只用到了 4 个单元格。虽然画法并不正确，但它暗示了一个规则。如果想要一个唯一环正常成立，那么它的所有这样的画法用到的格子数量也都得是偶数个单元格构成的。比如 8 个单元格拆解开后可以得到两个 4 个单元格的闭环；但右图却不能这么拆解。右图甚至你压根都找不着这样的闭环，最少的却会用到 5 个单元格，比如从 `r1c3` 出发可以得到的闭环：`r1c3` -> `r1c7` -> `r4c7` -> `r4c1` -> `r3c1`，然后再从 `r3c1` 连回 `r1c3`（这里就不单独画出来图片了）。用到奇数个单元格意味着你按照前文的涂色方案就会立马不成立：因为是奇数个单元格，所以交替涂色会使得最终头尾两处涂色完全相同。而这个闭环的任意相邻两个单元格一定在同一个行列宫，所以涂色相同意味着同一个行列宫内填入了重复的数字。这必然会矛盾。

所以这便是更为底层的规则：**唯一环成立需要规避无解的话，还需要找出唯一环的所有内部的闭环（不一定用完全部的单元格，只需要满足相邻连接的单元格在同一个区域，然后形成闭环即可）。如果存在至少有一个闭环是奇数个单元格长度的的话，那么唯一环照样不成立**。

## 总结 <a href="#conclusion" id="conclusion"></a>

总之，唯一环要形成，需要满足如下的一些条件：

* 偶数个单元格；
* 两两相连成闭环（相连的格子必须同在一个行列宫里）；
  * 这一点有了之后就一定会是 $$n$$ 个行列宫，不用把它当成条件再说一遍
* 用两种颜色交替涂色的方式验证内部填数是否不矛盾。

下一讲内容我们来看更高规格的唯一环的情况。


# 唯一环的规格推广

Size-Extended Unique Loop

前文的内容我们已经针对唯一环的基本逻辑进行了描述，下面我们来看看规格不是 6 个单元格的其他情况。

## 8 个单元格的唯一环 <a href="#size-8" id="size-8"></a>

<figure><img src="/files/letkoTA6Mgk3PwDmi1dN" alt="" width="375"><figcaption><p>8 格唯一环</p></figcaption></figure>

如图所示。我们发现，整个结构里只有 `r9c4` 包含额外的候选数 4。如果我们让它从盘面里消失的话，所有图中的 8 个单元格将只剩下 7 和 8。

我们试着套用之前给的规则，我们发现这 8 个单元格也满足。所以它是唯一环，能够引发矛盾。因此结论就是 `r9c4 <> 78` 了。和唯一矩形类似，这个地方也可以认为是 `r9c4 = 4`，但如果这个单元格包含其他的数字后，我们就只能认为他们其中一个是成立的，因此延续之前的说法，我们这里也统一给出的结论是删掉 7 和 8，而不是填 4。

我们来看一个更特殊的例子。

<figure><img src="/files/LZsQiBrUJaxQU4GDTDmz" alt="" width="375"><figcaption><p>8 格唯一环，另外一个例子</p></figcaption></figure>

如图所示。这个例子就是在前文提及过的以 8 个格子形式存在的、特殊构型的例子。这个例子和上面那一个例子的推理过程完全一样，所以证明过程就不赘述了。

## 10 个单元格的唯一环 <a href="#size-10" id="size-10"></a>

下面我们来看 10 个单元格的情况。

<figure><img src="/files/0mFCX83OGgK54dza3IVO" alt="" width="375"><figcaption><p>10 格唯一环</p></figcaption></figure>

如图所示。这里我们用的是类型 4 的思维。

我们发现，`b2` 里能填入 4 的只有 `r1c5` 和 `r3c6` 两个单元格。如果我们再让他们俩里剩下的那个单元格填 9 的话，那么 4 和 9 就只出现在其中，于是和结构其他的 8 个单元格一共凑满 10 个单元格。

按照之前介绍的唯一环的形成条件来看，整个 10 个单元格是可以满足唯一环的条件的。所以，它会形成唯一环那样的矛盾。因此，最初我们假设让 `r1c5` 或 `r3c6` 里填一处 9 就会直接引发矛盾。

因此，这个题的结论就是 `{r1c5, r3c6} <> 9`。

## 12 个单元格的唯一环 <a href="#size-12" id="size-12"></a>

<figure><img src="/files/0Mxufm9gEoUQdjp4Xmdc" alt="" width="375"><figcaption><p>12 格唯一环</p></figcaption></figure>

如图所示。这里我们用的是类型 2 的思维。

如果 `r1c3`、`r2c4` 和 `r5c2` 全部把候选数 1 去掉，那么图中结构用到的一共 12 个单元格会形成唯一环引发矛盾。

所以，这三个 1 不能全部同时去掉。反过来说就是，这三个 1 至少有一个是对的数字。那么，`r2c2 = 1` 会同时引起刚才得到的那三个 1 全部清除，所以 `r2c2 <> 1` 是这个题的结论。

## 14 个单元格的唯一环 <a href="#size-14" id="size-14"></a>

<figure><img src="/files/fYRLbDn1rV7gVrDMSZFP" alt="" width="375"><figcaption><p>14 格唯一环</p></figcaption></figure>

如图所示。这次我们用类型 3 的思维来看这个题。

由于图中 `r89c3` 里额外的候选数 4、7、9 不能同时去掉（会引发唯一环的矛盾），所以我们要确保里面剩下至少一个候选数填入到这两个单元格里。不过我们还发现，`c3` 里已经存在三个单元格只剩下 2、4、7、9 四种不同的候选数。那么我们刚好可以使得 `r89c3` 拿出一个数与他们配成一个显性四数组。所以，`c3` 其他单元格都不能是 2、4、7、9。所以这个题的结论是 `r5c3 <> 4`。

## 唯一环的最大规格是多少？ <a href="#max-size-of-unique-loop" id="max-size-of-unique-loop"></a>

唯一环肯定存在一个最大规格。那么，它应该是多少呢？18？16？

答案是 14。首先，我们要让一个唯一环在整个盘面里放上，以满足唯一环的形成条件，那么每一个宫最多只能用两个单元格。所以，粗糙地估计，唯一环最大是不能超过 18 的，毕竟就 9 个宫嘛。

但是实际上的是，18 是肯定不行的。一旦一个唯一环用到 18 个单元格，就直接说明这个题具有两个解了，毕竟就算其他数字我们不关心，但这两个数字内部直接可以随便换。

那么 16 呢？16 其实也是不行的。16 个单元格的唯一环意味着你要用到 8 个宫。那么最后剩下的那个宫势必会直接出现无法填数的矛盾。

为什么这么说？这里似乎有些难以理解。

让我们凭空想一下。在宫排除技巧里，我们知道一个潜在的特征：每一个宫都有 4 个和他并排同一个“大行列”的宫。比如说和 `b1` 并排的 4 个宫分别是 `b2347`。说宫排除是因为，我们假设要在 `b1` 内填数了，那么能够正常影响 `b1` 使得它出数的排除项必须落在 `b2347` 里，只有他们才能有机会影响到 `b1`。对于唯一环技巧而言，说这个的目的是让你明白，一旦一个盘面其中 8 个宫都用到，那么唯一没用到的那个宫势必和它并排的那四个宫全部是被唯一环用了。

但是，按照排除法的逻辑，四个并排的宫造成的排除效果，会同时让最后剩下的那个宫必定可以根据宫排除同时得到两个数的出数位置。但是问题就在这里。因为唯一环的摆放关系，最后引发的出数一定会落在同一个位置上。如果不落在同一个位置上的话，外部的唯一环要么就形不成，要么规格就不是 16，因为这俩的位置也会纳入其中。

如果你凭空想象不出来的话，那么我们来看 `b5` 其中一种能引发上述说法的唯一环的局部摆放：

<figure><img src="/files/iXPkmjykXxYuoWJKDEk8" alt="" width="375"><figcaption><p>一个能引起特殊矛盾的 16 个单元格唯一环</p></figcaption></figure>

如图所示。这是一个我随意构造的唯一环，用到 16 个单元格。之所以说是“随意构造的”，主要是为了解释我要说的矛盾的点，唯一环的连线反倒不是特别重要，只是怕你觉得这个大结构看不出来怎么连的，我才标出来的（不过是随意找了其中一个路径罢了）。可以看出，`b5` 的上下左右四个宫都会被唯一环所用，按照涂色不同来区分填数的不同，我们可以看到，绿色在 `b2468` 里有四处，而橙色也有四处。

虽然他们摆放位置不同，但是因为唯一环的原因，摆放特殊性会使得 `b5` 里，代表绿色和橙色的那两个填数因为排除法的关系会直接让 `r5c5` 同时填绿色和橙色数字，这显然就违背了数独规则。

这便是我要说的点——唯一环要用到 8 个宫的话，就会让外部摆放的数字引发两种数字的宫排除，其结论会使得不同的填数填入到同一个单元格上，引发这样的矛盾。

当然，你可能还是不满足于我这个说辞（毕竟哪哪看着都像是凑出来的例子）。那你不妨仔细品鉴一下，构造一些例子来对此进行严格的数学证明。不过这里就省略了。

所以，唯一环的最大规格是 14。

至此，我们就把唯一环的内容全部结束了。更多的例子还希望你自己去探索。这个技巧出现频率其实并不算高，因为规格的关系，它找起来的复杂程度确实很高，使得平时做题的时候很难遇到它。不过，在这么多例子的加持下，我相信你对唯一环的内容已经有了一个充分的认识。下面我们将进入到另一个技巧的学习。


# 拓展矩形（XR）

Extended Rectangle

欢迎来到新的技巧：**拓展矩形**（Extended Rectangle，简称 XR）。如果我们把唯一环称为唯一矩形在规格层面的推广的话，那么拓展矩形就是从数字种类数量上的推广。


# 拓展矩形的基本推理

Reasoning of Extended Rectangle

欢迎来到新技巧的学习。我们来看下拓展矩形技巧的基本推理方式。

## 类型 1 <a href="#type-1" id="type-1"></a>

<figure><img src="/files/IrM61sKsA7uF4esfUXEC" alt="" width="375"><figcaption><p>基础示例</p></figcaption></figure>

如图所示。唯一矩形不是用两种数字吗，我们这次用三种数字。

虽然因为数字种类多了，单元格肯定也得多点才能用于合适的推理，但是它和唯一环不同。唯一环是环状的，而拓展矩形不是环状的，而是顺着唯一矩形的结构横竖进行延伸。比如此题，它用到的单元格是 `r357c13` 一共 6 个单元格。

如果我们让 `r3c1` 里只剩下 1 或 5，则这 6 个单元格全部只剩下 1、3、5 三种数字。

现在我们使用一种和唯一矩形不同的假设模式来假设它。如果我们用字母 $$a$$、$$b$$ 和 $$c$$ 来表示三种不同的填数 1、3、5，则我们可以随意往里面塞这三种字母。注意填的时候要规避唯一矩形显而易见的矛盾：

<figure><img src="/files/3Th1nuN9rw6o4Vq7bby3" alt="" width="375"><figcaption><p>其中一种字母的假设</p></figcaption></figure>

如图所示。当然，这里的字母假设并非唯一的方法。这里只是给你展示一下它可以这么安放三种数字，至于哪个字母对应哪个数字，其实并不重要。

可以看出，图中有箭头标识。看出这个箭头代表什么了吗？是的，我们把字母按照箭头的方向对应位交换一下。

<figure><img src="/files/cGHmAucdLnEXGXNUOI3r" alt="" width="375"><figcaption><p>交换后的结果</p></figcaption></figure>

如图所示。在我们左右对换后，字母的位置显然发生了变化。但是这种变换是有效的，因为它并不会改变我们横纵填数的逻辑。比如说，`c1` 里原本就是三个字母 $$abc$$，现在换成了 $$bca$$，也仅仅是把填数次序换了，实际三个数字大体上照样没有变动。同理，其他位置也都如此。

这里尤其要注意，这种交换比你想象得要更严谨。因为它是左右对应位置交换，因此不论是行上还是列上，甚至是宫内，数字的种类都不会发生任何的变动。尤其是宫内，虽然结构是三行两列的，也就意味着行上和列上可能用到的格子数量不一样。但是实际上这种变动会使得原本是多少，交换后仍旧是多少。这个是非常神奇的，它也是拓展矩形的精髓。

当我们这种操作后，我们就清楚地知道，这种交换仍旧保证了唯一矩形要求的“所有行列上的填数不发生变动”。唯一矩形正是利用了这一点才得到后续不影响盘面其他候选数，因此产生两个填法违背唯一解的矛盾的点的。拓展矩形因为我们采用的方式可以保证这种现象即使在更多种不同数字出现后，仍然也可以产生矛盾，因此唯一矩形的那种推理和得到的矛盾也在此适用。

于是，这个题的假设就不正确了。因为我们假设 `r3c1` 只有 1 或 5，所以这个题的实际结论应该是 `r3c1 <> 15`。

我们把这个结构称为拓展矩形，即唯一矩形在矩形形状上没有发生变化（“矩形”二字保留），但仍有拓展。另外，由于它类似于唯一矩形的类型 1（标准类型），所以这也就被当成是拓展矩形的类型 1。

> 这里我要啰嗦一句。有些读者还是不明白为什么假设只有 1 或 5 的反面是同时删掉 1 和 5。这里我们其实是用到了逻辑学的开括号需要使用到的一个说法，叫德摩根律。假设只有 1 或 5，换个说法就是“填 1 或 填 5”。要把这个说法取相反的话，自然就是“不（填 1 或填 5）”。但是这里要把括号给打开，所以“或”要改成“和”，然后把“不”安插到两个“填”字的左边配上，所以就变为了“不填 1 和不填 5”。
>
> 对于逻辑学的一些细节，我们将在单开的板块里进行细致解答。

下面我们来看其他三种类型的拓展矩形。

## 类型 2 <a href="#type-2" id="type-2"></a>

<figure><img src="/files/G2DqsRfhfFE07XMurzOC" alt="" width="375"><figcaption><p>类型 2 例子</p></figcaption></figure>

如图所示。刚才我们看到的例子是三行两列竖着的，这回我们来看两行三列横着的。

假设我们把 `r46c9(5)` 从盘面里删除，则 7、8、9 三种数字可形成前文描述的对应位交换而产生的矛盾。不过这次我们是竖着上下交换，因为结构是从立柜式的改成平躺式的了，所以左右交换自然就换成上下对应位置交换。

由于其他的逻辑不变，所以这里就省略了。因为我们能得到矛盾，因此原本的假设不对。原本的假设是去掉 `r46c9(5)`，那么正确的结论就是 `r46c9(5)` 会形成区块结构。因此，结论就是删除 `c9` 和 `b6` 里其他位置的 5 了。当然，因为这个题的 `c9` 没有空格自然就不管了。所以这个题的结论是 `r5c9 <> 5`。

我们把这个称为类型 2（区块类型），因为它也是走唯一矩形的类型 2 演变而来。

## 类型 3 <a href="#type-3" id="type-3"></a>

<figure><img src="/files/oWipSsKbgf2uBT35WdaZ" alt="" width="375"><figcaption><p>类型 3 例子</p></figcaption></figure>

如图所示。和前文一样，我们可以立马得到 `r4c78` 里的候选数 8 和 9 是不能同时去掉的。另外，我们又发现 `r4` 上有两个单元格只有候选数 7、8、9，分别是 `r4c1` 和 `r4c6`。那么，我们可以尝试在 `r4c78` 里选择一个单元格填入 7、8、9 的数字，与 `r4c16` 配合形成显性三数组。所以这个题的结论就是 `r4c4 <> 8` 了。

我们把这个称为类型 3（数组类型）。

## 类型 4 <a href="#type-4" id="type-4"></a>

<figure><img src="/files/HUdJIxGY4n8rYRZJpvtd" alt="" width="375"><figcaption><p>类型 4 例子</p></figcaption></figure>

如图所示。我们发现 `c3` 里数字 1 形成了共轭对，于是不论这两个单元格哪一个填 7，另外一个单元格都肯定是 1，于是结构用到的 6 个单元格将只有数字 1、2、7，形成矛盾。

所以，结论就是 `r46c3 <> 7`。

这个就称为类型 4（共轭对类型）。

## 拓展矩形的形成条件 <a href="#condition-of-forming-extended-rectangle" id="condition-of-forming-extended-rectangle"></a>

可以从前面给的四个例子里看出，似乎他们具有一个共性，就是他们的摆放一定是位于并排的三个宫里。比如这个类型 4 的例子，用到的单元格只在 `b456` 里，而不会把其中的某个或某些单元格挪到比如 `b123` 上去，或者 `b789` 下面去。

这是显然的，因为一旦挪动出去了之后，拓展矩形就不再能够保证每一个宫在内部对应位交换时，宫内的填数也不发生变化了，因为此时宫内只有一个单元格了。

所以，拓展矩形需要形成的一大必备条件，也是唯一一个前提条件就是，所有的单元格都必须只能出现在并排的三个宫里。当然，别的一些细致的条件就不说明了，例如必须偶数个单元格什么的（毕竟每推广一种数字就需要多一对单元格，用于上下或左右配对交换）。

## 类型 3 的变体 <a href="#variant-type-3" id="variant-type-3"></a>

拓展矩形比我们想象得要复杂一些。下面我们来看下类型 3 的变体形式。

<figure><img src="/files/ugaGgbeLm6GevRzaYqFR" alt="" width="375"><figcaption><p>类型 3 变体，例子</p></figcaption></figure>

如图所示，我们发现这个类型 3 也太特殊了吧，删数都跑到结构里面去了。

可以看到，显然 `r4c4(6)` 和 `r7c4(7)` 不能同时从盘面里消失。否则数字 2、8、9 在 `r247c46` 里直接出现矛盾。所以，这两个数里至少有一个是正确的。

我们又发现，`c4` 里有两个单元格只有 6、7、9 三个候选数，于是我们就可以取出 `r47c4` 的其中一个单元格填入最终的 6 和 7，与 `r68c4` 配合形成显性三数组。

等会儿！拓展矩形用的数字是 2、8、9，已经用到了 9。而显性三数组也用到了 9，这还能成立吗？实际上是能的，因为推理过程之中，`r47c4` 里拿出 6 或 7，实际上是跟 9 没有关系的。硬要说有关系，那也得等到后面一步了，因为这里我们无论如何都不知道 9 的具体填法，只知道 6 和 7 有对的数字。

而得到这一点后，恰好我们可以利用 `r68c4` 形成三数组。到这一步而言，都没有什么不妥。那么，既然三数组会形成的话，我们可以很明确地知道，`r47c4` 只能拿出 6 或 7，而不能给三数组提供 9 的位置摆放。但是不论是 6 还是 7，`r68c4` 里都会有一个候选数 9 的存在，因此你一旦往 `r47c4` 里填进去 6 或 7，`r68c4` 的其中一个单元格都会产生一个 9 的填入。而这个数字 9，只能产生在这里。所以，拓展矩形原本存在的候选数 9 没有任何机会填入。

所以，这个题的结论就是，`c4` 里所有除了三数组用到的四个单元格外的其他任何单元格都不能填 9，即 `r247c4 <> 9`。本题我选用了深红色更为醒目的方式暗示这个删数就算是结构的一部分，也会因为结构的推理过程而返回来删除它自己。这种现象被称为“自噬删数”，不过这个术语是后面一些技巧才会用到的，这里就不过多说明了。

## 类型 4 的变体 <a href="#variant-type-4" id="variant-type-4"></a>

除了类型 3，拓展矩形的类型 4 也存在一种变体形式。前面的类型 4 给我们标注的共轭对是沿着配对交换的方向在延伸。这次我们把共轭对的方向改一下，改成沿着并排的宫的方向延伸。

<figure><img src="/files/1wLAYSS1sdfnSfHL5LHV" alt="" width="375"><figcaption><p>类型 4 变体例子</p></figcaption></figure>

如图所示。这次我们换了下共轭对的方向，删数就比正常类型要诡异一些了。

可以看到，由于 4 只能在 `r7c38` 里填一个，所以这两个单元格另外一个位置不能是 3 也不能是 9。这是显然的，因为拓展矩形用到了数字 3、4、9。一旦填了 3 或 9，另外一边因为是共轭对的关系填上了 4，于是 6 个单元格就会直接形成拓展矩形的矛盾。

所以，这个题的结论就是 `r7c3 <> 9` 和 `r7c8 <> 3`。当然，删数 3 和 9 在逻辑上是可以合并的（例如说就算 `r7c3` 也有 3，也是可以删除的），因此也可以直接把这个删数简单记作 `r7c38 <> 39`。

你肯定有所怀疑，是否这种删数规则也适用在标准的那个类型 4 里。实际上是可以的。下面这个例子就展示了它的删数情况：

<figure><img src="/files/uHe7Taum0hLmx5wLjcI6" alt="" width="375"><figcaption><p>类型 4，删数数字不一定相同的情况</p></figcaption></figure>

如图所示。不过这个例子就自己看了。

## 胖和瘦的概念 <a href="#fit-and-fat-types" id="fit-and-fat-types"></a>

和唯一环不太相似的一点是，拓展矩形因为结构的特殊性，它具有一种独特的概念：**胖拓展矩形**（Fat Extended Rectangle）和**瘦拓展矩形**（Fit Extended Rectangle）。

所谓胖瘦，指的是拓展矩形在摆放的时候是否是顺着并排的三个宫的方向在延伸。如果是的话，就是瘦的；否则就是胖的。

根据定义，因为所有前面给出的例子都是顺着并排的宫的横纵方向在延伸单元格，所以前面我们看到的都是瘦拓展矩形。下面我们来看看胖拓展矩形到底长啥样。

<figure><img src="/files/rj13tqbVckRzoJAUUf73" alt="" width="375"><figcaption><p>胖拓展矩形</p></figcaption></figure>

如图所示。可以看出，它是类型 2。不过它的外貌确实有所不同。我们发现，同一个宫里不再是前面那样只有两个单元格，而这个似乎转了一下，每一个宫都有 3 个单元格，也只用了两个宫。

这个结构能否适用拓展矩形的逻辑推导呢？也是适用的。假如我们把 `r13c3(9)` 去掉，所有 6 个单元格就只剩下 1、3、6 三种候选数。

我们这次仍旧顺着并排宫的方向对应位进行数字交换，于是我们有下面这样的匹配方式：

<figure><img src="/files/NAndrusyUZJHWquKgRCM" alt=""><figcaption><p>胖拓展矩形的交换方式</p></figcaption></figure>

如图所示。这样便有了和前文一样的交换模式，于是，矛盾仍然可以形成。既然矛盾能形成，那么删数结论自然也就成立了。

下面我们再来看一个例子。不过就自己推理了。

<figure><img src="/files/hLeOAssz8M8p6jk7BPsu" alt="" width="375"><figcaption><p>胖拓展矩形，另外一个例子</p></figcaption></figure>

如图所示。这里就交给你自己看了。


# 拓展矩形的规格推广

Size-Extended Extended Rectangle

前面我们讲解了拓展矩形的形成条件和一些例子。下面我们来看看拓展矩形在规格上推广的情况。

## 8 个单元格的拓展矩形 <a href="#size-8" id="size-8"></a>

<figure><img src="/files/AJM5Fw4fNOSsb7CVEI4G" alt="" width="375"><figcaption><p>8 格拓展矩形</p></figcaption></figure>

如图所示。我们关注 `c12` 里图中高亮的 8 个单元格。如果我们让 `r8c1` 只有候选数 6 和 7，则这 8 个单元格将会左右形成互换，造成拓展矩形的矛盾。只不过这次交换逻辑，不再只假设三个字母，而是要用到四个数字，即四个字母 $$abcd$$ 了。

因此，假设并不成立，所以这个题的结论是 `r8c1 <> 67`。

## 10 个单元格的拓展矩形 <a href="#size-10" id="size-10"></a>

<figure><img src="/files/5GVJFFnTneCFFeH1KvsJ" alt="" width="375"><figcaption><p>10 格拓展矩形</p></figcaption></figure>

如图所示，这个题用到类型 2 的思路。

如果我们同时去掉 `r67c4(5)`，则余下的候选数 1、6、7、8、9 在 `r13678c45` 这 10 个单元格里填数可形成左右交换，进而造成矛盾。

所以，这两个 5 至少有一个数是对的填数。虽然他们跨宫出现，不属于区块，但是我们仍旧可以当成类似区块一样的效果，进行删数，删的则是 `c4` 其他单元格里的候选数 5。所以这个题的结论是 `r4c4 <> 5`。

## 12 个单元格的拓展矩形 <a href="#size-12" id="size-12"></a>

和唯一环不同，因为拓展矩形会在并排的宫里拓展单元格，因此这会造成类型 3、4 更加不常见。我尚没有找到合适的类型 3、4 的用例，所以仍然给各位展示类型 1、2 的情况。

<figure><img src="/files/l9jMtRibmy0fsgJlWx0U" alt="" width="375"><figcaption><p>12 格拓展矩形</p></figcaption></figure>

如图所示。这次我们把结构放躺下了。如果我们让 `r6c7` 只剩下数字 1、3、4、8（即不要那个 5），则上下对应位置的填数则可以形成交换，于是造成两种填法的矛盾。

因此，`r6c7 <> 1348` 是这个题的结论。

## 14 个单元格的拓展矩形 <a href="#size-14" id="size-14"></a>

<figure><img src="/files/Ox8ZqaJwl8lLx4KlotXg" alt="" width="375"><figcaption><p>14 格拓展矩形</p></figcaption></figure>

如图所示。这个题的结论是 `r8c2 <> 1349`。不过就自己看了。

## 拓展矩形的最大规格 <a href="#max-size-of-extended-rectangle" id="max-size-of-extended-rectangle"></a>

既然唯一环有最大规格。那么对于拓展矩形来说也肯定是有最大规格的。不过巧就巧在，拓展矩形的最大规格的答案，也是 14。

首先，18 肯定是不可能的。18 意味着两个行或列全空。一旦完全空出来，则这两个行或列由于在并排的三个宫里存在，所以 100% 可以形成对应位交换，客观就形成了两个填法，这是肯定不可以的。

那 16 为什么不行呢？因为 16 意味着我们要用到 8 个不同的数字。而由于拓展矩形的摆放是“对齐”的（左右对应位或者上下对应位交换，所以结构一定是 $$n\times2$$ 或 $$2\times n$$ 的摆放模式）。正是因为这个原因，最后剩余的那个没用的数字将会挤入同一个行或列上，这直接会引起同行列填入相同数字的、违背数独规则的填法矛盾。

所以，拓展矩形的最大规格也是 14。只不过，拓展矩形最大规格的这个答案理解起来会比唯一环要简单一些。

那么至此我们就把拓展矩形的内容也全部介绍完了。下面我们来看看最后一种需要放到前面介绍的致命结构技巧。


# 全双值格致死解法（BUG）

Bi-value Universal Grave

这是最后一个和唯一矩形、唯一环等技巧类似的、基于题目唯一解的、可以放在这里的推演技巧了。这个技巧学完之后，更多的这样的技巧我会放在最后面，因为他们都很难理解和推理。


# 全双值格致死解法的基本推理

Reasoning of Bi-value Universal Grave

别被标题给吓着了。这个技巧的名字确实有些长，这是因为我没有找到一个合适的翻译这个技巧的、而且还能比较简单的名称。

我们还是先来看看这个技巧的推理逻辑吧。

## 推理过程 <a href="#reasoning" id="reasoning"></a>

<figure><img src="/files/JQ9T3wiLJlj8vrOwHYtb" alt="" width="375"><figcaption><p>类型 1 例子</p></figcaption></figure>

如图所示。我们时不时在做题的时候会遇到这种匪夷所思的题目状态，导致我们无法进行下去。这样的盘面一般都具有如下的两个特征：

1. **所有空格都只有两个候选数**（不过有一个单元格会多一个候选数出来作为特例存在）；
2. **对于每一个候选数而言，他所在的行、列、宫，对于这个数字来说都会出现恰好两次**（不多也不少，而且还是每一个行、列、宫都是两次，不是“或”的关系，是“且”的关系，即对这个数而言，它所在的行、列、宫全都是共轭对）。当然，第二点的特例也存在。落在唯一的这个三个候选数的格子里，有一个数就会同时在行、列、宫上出现三次。

虽然我们还不知道为什么，但是很显然，这个特殊不满足条件的候选数肯定有猫腻。我们不妨假设它不存在。对于这个题来说，不满足的这个候选数是 `r8c9(1)`。

如果 `r8c9 <> 1`，那么所有候选数将全部满足前面两点提到的特征，没有任何特例。我们可以思考一下。由于第二点的出现，倘若我们给任何一个单元格填上一个数字，因为行、列、宫都出现两次的缘故，所以这个数只要填上一个，那么另外一端就必然不能填这个数。而结合第一点，我们又可以知道，因为另外一端不能填这个数，所以这个格子就只剩一个可填的数了。

结合这两点，我们就会引起牵一发而动全身的效果：填一个数，引起所在行列宫的另一端不填这个数，于是填另外的一个数；然后这个数又会引发它自己所在的行列宫的另一端不填这个数，于是又填别的数。这样两点连续交替循环着这么一直往下填写数字。

举个例子，`r2c1` 此时有两个候选数 1 和 6。我们填入 1 的话，盘面会引发前面的循环交替逻辑，一直往后填写数字的逻辑，并会产生一种盘面的填数效果，最终得到一个盘面；而我们如果填入 6 的话，因为这个单元格的填数和第一个情况的假设不一样，所以起点的引发交替填数的状态也会跟着变化，所以这么循环着填写，将会产生另外一种盘面的填数效果，最终产生另外一个盘面。

我们先不管这么做能不能填出来答案。但对于这样两个特征而言，它取决于我们选取的格子和数字。但很明显，最初我们假设 `r8c9 <> 1` 之后，所有数字近乎可以说是没有任何的区分，所以这两个填数状态所产生的盘面应该不会存在其中只有一个是合理填法，另外一个不合理的情况。要么它俩都合理，要么它俩都不合理。这里的合理说的是填数内部会不会引发违背数独规则的矛盾出现（如同行列宫出现两个相同的数字填数啥的）。

这一点很重要。因为一个题目只会有唯一解。换言之，每一个空格不管怎么去做，最终都只会存在一个正确的填数。既然如此，前文所描述的两个填法就不可能都合理：因为起始假设的数字本就不一样，产生的两个盘面就自然不可能都合理了（都合理的话，这题就俩答案了）。所以，既然不能都合理，那么就只可能都不合理了。

不合理意味着内部总会存在矛盾，所以既然两种填数模式都不对的话，那原假设 `r8c9 <> 1` 就根本不可能正确。如果你还是没明白，那你就顺着再理一遍逻辑：如果假设是对的，那么我们能得到这两种模式的填数都对的结果（因为他俩只可能都不对或都对）。但是都对意味着题目出现至少两个填法，这是违背数独唯一解的规则的，所以就矛盾了。

所以，原假设不成立。既然 `r8c9 <> 1` 是错的，那么它的对立面就肯定是 `r8c9 = 1` 了。所以这个题的结论就是 `r8c9 = 1`。

我们把这个推演的逻辑称为**全双值格致死解法**（Bi-value Universal Grave，简称 BUG）。从名字上可以看出，由于我们假设不填某一个候选数后，会引发全盘都是两个候选数的状态，进而出现矛盾（致死）的现象。另外，技巧名里的**双值格**（Bi-value Cell）是一个术语，指的是单元格只有两个候选数的情况。换言之，前面两点可以通过术语改一下描述变为这样：

1. 所有空格都是双值格；
2. 所有候选数所在行、列、宫均存在跟这个数绑定的共轭对。

这样就简单不少了。

## 问题解答 <a href="#questions" id="questions"></a>

下面针对于前面的推理解答一些常见问题。

### 问题 1：我还是想看看怎么矛盾的 <a href="#question-1" id="question-1"></a>

当有些时候你无法只凭借理论得到你想要的答案时，你就会提出这种问题。显然你并不相信前面的理论是合理的。那么我们来看看为什么会引发矛盾。

<figure><img src="/files/KedxsrQSdc0WR4ADEKsM" alt=""><figcaption><p>前面两种填法引发的矛盾</p></figcaption></figure>

如图所示。这是前面那个题。我尝试去掉了 `r8c9(1)` 后，填入了 7 和 9 并产生了这样两个盘面。很显然，在假设期间，我并未针对于题目具体哪一个单元格作为起始点假设作限制，所以前面举例用的是 `r2c1` 来说的，不过这里我们还是拿 `r8c9` 来作为起始点假设会稍微好理解一点。

很明显我们可以发现到的是，`r9` 此时不论是哪一个情况，都无法继续填入合理数字——因为 `r9` 的 1 和 9 总是会出现矛盾（要么填不进去，要么就是填两次）；更有甚者（点名 `r7c1`）甚至都没有合理的候选数可填了——本该填 1 或 9 的，但因为列上已经出现这个数，所以这个空格此时没有任何正常的候选数。

这便是我想说明的点。两个盘面的假设过程是被我们初始时控制了的。我只是单纯要求你必须假设的两个填法的起始单元格一致。这个点也很重要。因为假设一致才能控制变量。如果起点都不一样，你很难（甚至可以说不能）得到“两个情况都对或者都不对”这个说法是否成立。

### 问题 2：为什么特例的那个候选数在行列宫必须都出现三次？ <a href="#question-2" id="question-2"></a>

可能你已经发现，最后余下的那个特例（也就是最终正确的那个候选数），它在所在的行、列、宫上均出现了三次。这个“且”的关系非常奇怪。为什么这个技巧会存在这么个现象？

其实你自己思考片刻也能想出答案。如果我们把他去掉，它才能引发前面这一大堆描述，才能产生矛盾的话，这个数还真就必须出现三次。因为把它从盘面里去掉的话，相当于让这个数字所在的行、列、宫都同时少出现一次。要使得全盘所有候选数均出现两次，显然它的初始存在的状态就必须都出现三次才行。如果其中有一个区域不是三次的话，当我们去掉它时，就不能保证这个数在这个区域上还剩下两次可填位置的这么一个说法，于是，这个技巧就不能正常使用了。

### 问题 3：我想看看不满足这个技巧推演的盘面长啥样 <a href="#question-3" id="question-3"></a>

是的。我觉得你凭空很难想出这种盘面的长相。下面我带你看看，什么样的盘面不能使用这个技巧。

<figure><img src="/files/Y0fIuc5Et3SYRu78TDC6" alt="" width="375"><figcaption><p>第一个不能用这个技巧的例子</p></figcaption></figure>

这是第一个例子。可以看出在，这个题确实满足第一点要求。但第二点似乎并不满足：数字 9 在 `r7` 上出现了三次，但出现的位置并没有正常落在**三值格**（Tri-value Cell）上，即 `r7c6`。

很显然的是，因为这种摆放的特殊性，它并不满足第二点。数字 9 在行上出现了三次，但对于 `r7c1` 来说，数字 9 在列和宫里却只出现了两个 9。但它行上却有三个，而并不是最初所说的全都两个。

如果我们还是继续使用这个技巧会如何？会发现我们推演不下去——我们甚至都不知道假设的那个数、从盘面里消失的那个候选数到底是哪一个。就哪怕我们认定这个 `r7c1(9)` 是我们要去掉的数，那么我们尝试让它从盘面里消失，那么此时 `c1` 会只有一个 9，这不就直接成排除法了么。然后？然后还推理啥啊，直接填数就完事了。根本就遇不到后续我们想要造成的“两种牵一发动全身”的填数模式。

这是一个例子。我们再来看一个例子。

<figure><img src="/files/l57nWCVceBGRpUofJYI5" alt="" width="375"><figcaption><p>第二个不能用这个技巧的例子</p></figcaption></figure>

如图所示。这个题看起来正常了不少，`r7` 上数字 3 确实出现了三次，而也确实存在三值格 `r7c5`。似乎看起来这个多出来的 3 一定会在 `r7c5` 上。其实不然。可以看到，在 `c5` 上，数字 3 仍然就只出现了两次，并没有出现三次，还是两次。

所以总体来说，只要不满足前文两点的任意一点的，都无法使用这个技巧进行推理。当然，这个题实际上也确实比较特殊一些：`r9` 有关于数字 3 的行排除技巧的结论，然后？然后这个题后面就可以一直直观技巧做下去。

那么，看起来似乎这个技巧的形成条件非常苛刻，是否这个技巧的使用在平时做题之中并不常见呢？其实并不是。这非常反直觉。实际上，这个技巧在你完成一些难度较大的题的时候，反而比较常见。当你做到一个题卡住的时候、发现双值格非常多的时候，不妨停下来看看，是不是这个题可以用到这个技巧。而且，这个技巧有个特殊之处——因为我们最终得到的结果是确定的填数，因此在结论得到之后，后续就不存在任何候选数技巧了，全是直观技巧。

> 当然，这个说法仅限这种直接可以出数的情况。后面我们要介绍一些例子，由于它也利用了唯一解，所以它和唯一矩形这些技巧一样，也具有其他的类型。在那些类型下，这一点是不一定的。


# 全双值格致死解法的其他类型

Other Types of Bi-value Universal Grave

下面我们针对于全双值格致死解法的逻辑进行推广。

## 类型 2 <a href="#type-2" id="type-2"></a>

<figure><img src="/files/kh4TlIjK3X4jE6SuRhsr" alt="" width="375"><figcaption><p>类型 2 例子</p></figcaption></figure>

如图所示。这次我们把前文一个三值格的规矩给破坏了。这回倒好，直接一连给了仨。

这里我们就不能单纯通过数格子数量和出现次数来决定了。可以看到，例如 `c5` 里数字 7 一共出现了四次（位于 `r1369c5` 四个单元格里）。按照这个技巧的推理逻辑，我们是要保证数字只能行列宫出现恰好两次的。四次未免太多了点；而且，单独看行的话，比如 `r1` 里，数字 7 又只有三个（即 `r1c356` 三个单元格）。这比较容易陷入误区导致无法继续。

在这里我们需要让思维灵活起来。我们不是想让最终形态称为行列宫两次吗？那么我们不妨把这些“异常的”数字 7 全给拿掉，再来看看是不是真的会产生矛盾。有一个很好的消息是，当我们去掉了 `{r16c5, r3c4}(7)` 后，似乎 7 的异常状态消失了：这些 7 会影响到 `r136`、`c45` 和 `b25` 这七个区域。而恰好的是，这七个区域下，当我们干掉了他们仨之后，数字 7 的出现次数恰好均变为了两次。

这非常好。因为后续的矛盾需要依赖这两个特征。而删除了这三个位置的 7 确实引发了两个特征的形成，所以后续造成的矛盾也会正常得出。也就是说，假设这三个单元格都没有候选数 7 时，矛盾会得到。因此，这三个单元格里必须有一个位置是填 7 的。

那么，我们仍旧借用类似 XYZ-Wing、唯一矩形类型 5 那般的删数方式，可以得到这个题的结论是 `r3c5 <> 7` 的结论。

由于它用到的是前文类似唯一矩形类型 2 的逻辑，所以我们也约定俗成把他叫做类型 2。

这里要提及一个术语。我们把这三个候选数（全部去掉后会造成如此矛盾的候选数）称为**真数**（True Candidate）。不过需要注意的是，真数的定义指的是他们不可同时全部去掉，所以其中至少会产出一个数是“真”的，并不是说他们全都为“真”；当然，真数也适用于前面一篇文章里的那个类型（类型 1）。那个类型里只有一个真数：那个对的数字就是真数。

## 类型 3 <a href="#type-3" id="type-3"></a>

下面我们来看类型 3 的内容。

稍微需要说的是，由于这个技巧产生的真数可能形状非常特殊，因此它并不完全和之前介绍的唯一矩形这些技巧一样那么像。在理解上，这个技巧的类型 3 会更加抽象一些。所以我会尽量解释得比较清楚一些。

### 显性数组 <a href="#with-naked-subset" id="with-naked-subset"></a>

先来看显性数组的部分。

<figure><img src="/files/4Yh5q2XtZnbOpN0qLDBc" alt="" width="375"><figcaption><p>类型 3 例子</p></figcaption></figure>

如图所示。因为是开胃菜，所以这个例子还是很像的。

显然，这个题里一共有两个真数：`r2c7(7)` 和 `r6c7(8)`，而且还在同一个列上。第一次见到这种情况，会不会觉得有些神奇？

按照前面给的那么多次重复的推理，这个题肯定也不例外的是，他们不能同时从盘面里消失；因此必须要拿出一个数，和 `r7c7` 配对形成显性数对。因此，`c7` 里的任何其他的单元格都不能再填 7 或 8。于是这个题的结论就是 `r1c7 <> 7` 和 `r5c7 <> 8` 了。

这还是很简单的。我们再来看一个例子。

<figure><img src="/files/v5EfXryUHMod9CFy1aj2" alt="" width="375"><figcaption><p>第二个类型 3 的例子</p></figcaption></figure>

如图所示。这次也只是把显性数对变成了显性三数组而已，真数仍旧只有两个，于是配合 `r6c19` 形成关于 1、4、6 的显性三数组。

于是删数也就有了：`r6c2 <> 6` 和 `r6c6 <> 4`。

最后我们再来看一个我说得比较抽象的例子。

<figure><img src="/files/GcSxRm0yvVjhz6HAqMvF" alt="" width="375"><figcaption><p>第三个类型 3 的例子</p></figcaption></figure>

如图所示。这个题很明显长得就很抽象。真数有三个：俩 4 和一个 2。比较容易想到的是，三个真数肯定不能同时消失，因此至少有一个数是对的。在我们得到这一点后，2 和 4 具体填什么就显得没那么重要了。虽然看着很奇怪，但是我们注意到，`r6c5` 这个单元格只有候选数 2 和 4，它好像在诉说着什么。

是的，这三个真数肯定会拿出一个数字和这个单元格配合形成显性数对。不论是 2 也好，还是 4 也罢，最终填的数字也只能有 2 或 4 的身影，这便促成了和 `r6c5` 配对的效果。

于是，同行上的其余单元格都不能填 2 或 4，所以这个题的结论就是 `r6c1 <> 2` 和 `r6c2 <> 4`。

### 隐性数组 <a href="#with-hidden-subset" id="with-hidden-subset"></a>

下面我们来看隐性的版本。

<figure><img src="/files/BHwCX5R9Eya3jmhCCriF" alt="" width="375"><figcaption><p>第四个类型 3 的例子</p></figcaption></figure>

如图所示。这回我们倒过来看。

可以看到，`c3` 里，数字 3 和 9 总体只能出现在 `r367c3` 里。因为真数要占用单元格，又为了确保 3 和 9 能填到 `c3` 之中，那么不论怎么填写，`r3c3` 都不可能有填 4 的任何机会。为什么呢？因为我们要确保 3 和 9 填写得当，那么 `r367c3` 必须要留出两个空格填他们俩。而真数也是必不可少的，所以至少真数也需要占用一个 `r67c3` 的其中一个单元格。

那还能说什么呢？最低最极限的情况也得必须是三个单元格肯定会被用完，根本轮不到 `r3c3` 填 4。所以，结论就直接出现了：`r3c3 <> 4`。

这看起来并不像是隐性数组。但是只看 3 和 9 的话，你可以把他理解为这样：真数只能出一个，然后剩下两个单元格构成隐性数对结构。

下面我们再来看一个例子。

<figure><img src="/files/sV9fUdVKsHlneyGBbPO2" alt="" width="375"><figcaption><p>第五个类型 3 的例子</p></figcaption></figure>

如图所示。我们也把规格搞成三数组来看看有什么不一样的地方。

这个题的真数有三个，不过其中两个比较特殊：他们位于同一个单元格里。这是可以的，因为我们最终确保的是矛盾的出现，即所有数字在行列宫里出现两次即可；如果一个格子有四个候选数的话，只要这个题确实存在真数的模式引发矛盾，那么我们就有正常的取数逻辑把其中的两个给拿出来。

我们确保三个真数后，我们发现，数字 1、6、8 只能填在 `r5c1367` 四个单元格里，而且其中有两个单元格还得放真数。我们为了确保 1、6、8 正常填入 `r5`，那么必须要拿出其中三个单元格填 1、6、8；而剩下的那个单元格必须是真数。所以真数单元格的两个的其一必须是真数，另外一个单元格会配合 `r5c16` 形成关于 1、6、8 的隐性三数组。

那么，`r5c6` 就没有机会填别的数字了。因此，`r5c6 <> 9`。

不得不说，这个技巧的隐性数组的推理模式略显别扭。不过事实是，类型 3 在实战做题之中出现频次也极低（甚至比四阶鱼还要低），因此就当图个乐学习一下就好。

## 类型 4 <a href="#type-4" id="type-4"></a>

下面我们来看类型 4。

<figure><img src="/files/Va0SjUFq8nZQGwyplfQN" alt="" width="375"><figcaption><p>类型 4 例子</p></figcaption></figure>

如图所示。类型 4 和类型 3 也一样，因为长相特殊所以极为罕见。这个题有 4 个真数。分布的位置也极为特殊：`r12c7` 两个单元格里分别有俩真数安插在里面；然后还有一个关于数字 9 的共轭对。

很显然，共轭对代表了两个单元格必须填一个 9；而另外一个单元格呢？必须填真数。因为四个真数必须有至少一个是正确的填数，否则会引发矛盾。所以，这两个单元格要么共轭对要么真数，根本就轮不到其他数字的填写。因此，这个题的结论就是 `r1c7 <> 4` 和 `r2c7 <> 1`。

## 全双值格致死解法 + n <a href="#bug-plus-n" id="bug-plus-n"></a>

因为这个技巧涉及的是全盘所有单元格，所以真数可能位于全盘的任意位置。因此，真数一旦至少存在两个，就可能位于盘面的任意位置。在前面的例子里，我们看到的均是在同一个行列宫里的情况（当然，类型 2 除外；不过类型 2 比较简单，所以就算不在同行列宫看起来也容易，毕竟只用得上同一种数字）。

下面我们来看的是，将类型 2 推广成不同数字，却仍旧可以按类型 2 引发删数的特殊例子。

### 全双值格致死解法 + 2 <a href="#bug-plus-2" id="bug-plus-2"></a>

<figure><img src="/files/JhYqn7aXTNxgLtioLRFn" alt="" width="375"><figcaption><p>BUG + 2</p></figcaption></figure>

如图所示。先来看最基础的例子。这个题有两个真数，两个真数位于同一个行（也可以说是同一个宫），但是，一边是 5 一边是 9，数字不相同。

> 有人问，这俩真数是怎么得到的？为什么不能是选取左边的 9 右边的 5？如果你知道我之前说的，删掉才引发矛盾的这个意思的话，你就会知道，我们这里看的是最终引发矛盾的形态需要怎么选取数字组合才能出现。显然左边选取 5 才是合理的：因为左边的单元格 `r6c4` 里，数字 5 在列上有三个，9 只有两个。如果选取 9 的话必然形不成矛盾（去掉之后 9 就剩一个了）。

那么，这里的两个删数结论是怎么来的呢？先看左边 `r6c4 <> 9` 的结论。因为真数的结论是至少有一个是正确的填数，那么我们干脆就列举一下两个真数最终的填数形态。

* 如果 `r6c4 = 5`，则因为这个单元格已经填了数字，所以 `r6c4 <> 9` 客观成立；
* 如果 `r6c6 = 9`，则因为同行上不能填入相同数字，所以 `r6c4 <> 9` 仍然成立。

我们并不关心最终真数有几个填写进去了，但是这样列举出来肯定是能保证至少有一个成立就能得到删数结论的。所以，`r6c4 <> 9` 是正确的删数。同理，`r6c6 <> 5` 也是一样的。

我们把这种类似类型 2 但是因为数字种类不相同的情况，在这个技巧里有个特殊的叫法：“+ n 逻辑”。有多少个真数，我们就往这个技巧的技巧名上加上数字几。比如这个题我们就叫“全双值格致死解法 + 2”。当然，我们之前说过它的简称是 BUG，所以也可以记作 BUG + 2。

当然，类型 1 按照这个命名规则也可以记作 BUG + 1。只是说就一个真数也谈不上类似于类型 2 了。这个理解方式还是得看人。

下面我们再来看一个 BUG + 2 的例子。

<figure><img src="/files/wwQuBY5e3r7AMe1XRu70" alt="" width="375"><figcaption><p>真数全在一个单元格的 BUG + 2</p></figcaption></figure>

这次我们再特殊一些。真数的数字不同，但在同一个单元格里。

这非常特殊。删数的话就肯定是这个单元格里其他不是真数的全部数字了。因为两个真数必须有一个是正确的填数。既然在同一个单元格里，就轮不到填入别的数字。所以 `r5c4 <> 45` 是这个题的结论。

### 全双值格致死解法 + 3 <a href="#bug-plus-3" id="bug-plus-3"></a>

有 + 2 就肯定有 + 3。甚至更多。既然不缺例子，那么我们干脆就多看点例子。虽然他们的推理完全和前面的一样。

<figure><img src="/files/O6DyTfVYX9YO7JjngAl0" alt="" width="375"><figcaption><p>BUG + 3</p></figcaption></figure>

如图所示。我们列举一下三个真数的填数情况：

* 如果 `r4c8 = 1`，则由于同列不能填入重复数字，所以 `r7c8 <> 1` 成立；
* 如果 `r7c8 = 6`，则由于同一个单元格已经填入数字，所以 `r7c8 <> 1` 显然成立；
* 如果 `r7c9 = 1`，则由于同行上不能填入重复数字，所以 `r7c8 <> 1` 仍然成立。

所以，所有的三种情况都能得到相同的结论，因此，`r7c8 <> 1` 是成立的。

### 全双值格致死解法 + 4 <a href="#bug-plus-4" id="bug-plus-4"></a>

<figure><img src="/files/T8vetSruwbucTNqf0lmA" alt="" width="375"><figcaption><p>BUG + 4</p></figcaption></figure>

如图所示。这个例子也是一样的，所以就不推理了，自己看下吧。

### 全双值格致死解法 + 5 <a href="#bug-plus-5" id="bug-plus-5"></a>

对于真数过多的情况，一般的题就很少能遇得到了。所以和前面一样，图个乐。看一下就行。

<figure><img src="/files/81IgMGopDISpqKJn66Ex" alt="" width="375"><figcaption><p>BUG + 5</p></figcaption></figure>

如图所示。这个题有 5 个真数。

### 全双值格致死解法 + 6 <a href="#bug-plus-6" id="bug-plus-6"></a>

<figure><img src="/files/fiGnVd9ArqOYY9QzJUR5" alt="" width="375"><figcaption><p>BUG + 6</p></figcaption></figure>

如图所示。这个题有 6 个真数，其中有两个真数位于同一个单元格里。

### 全双值格致死解法 + 7 <a href="#bug-plus-7" id="bug-plus-7"></a>

<figure><img src="/files/AkZcMcsTxjSZXlPJnqWi" alt="" width="375"><figcaption><p>BUG + 7</p></figcaption></figure>

如图所示。这个题有 7 个真数，已经达到了比较极限的地步了。

在我目前本地的题库里，7 个真数已经算是非常极限的存在了。我没有 8 个及以上数量的真数、还能引发删数的例子了。但是，理论上他们是应该存在的。

## 假数逻辑 <a href="#false-candidate" id="false-candidate"></a>

既然有真数，自然就会有**假数**（False Candidate）。真数的意义在于，所有真数里至少有一个是正确的填数；那么假数的话，就是至少有一个是错误的填数。

不过，这个说辞对于使用而言还是比较复杂的，所以本文仅只针对于单一假数的情况进行举例。

<figure><img src="/files/DoAeFabEh7gfQQxK6JEU" alt="" width="375"><figcaption><p>假数例子</p></figcaption></figure>

如图所示。仔细对照盘面，我们发现似乎这个题压根跟全双值格致死解法没有半毛钱的关系，因为这个盘面的候选数压根就不满足使用逻辑，更别谈真数什么了。

但是，请注意 `r5c8(2)`。如果我让 `r5c8` 填上 2 会如何？填上 2 之后，`r5c8` 的所在行和所在列上出现三次 4 因为被 2 占位而少去一次，填入 2 又会同时使得所在的行、列上（尤其是 `r46c8` 和 `r5c1` 这三个单元格）从三值格退为双值格。

在我们移除这些候选数后，剩下的盘面就会变为可使用这个技巧的盘面。严格来说，因为它直接满足了那两点特征，所以盘面直接就形成矛盾了。

所以，假设并不成立。我们最初的假设是 `r5c8 = 2`，它是错的，所以结论就是 `r5c8 <> 2` 了。我们把这种推演逻辑称为全双值格致死解法的**假数逻辑**（Bi-value Universal Grave False Candidate）。

鉴于这个逻辑非常不好理解，所以就一笔带过了。一般在做题的时候由于它需要反向推演，先找假数，然后推出假数填入后才会形成的盘面状态是否矛盾，所以它会稍微复杂一些。

## XZ 逻辑 <a href="#bug-xz" id="bug-xz"></a>

下面我们来看一个前面技巧都不曾提及的一种类型。

<figure><img src="/files/WepKCNl2sncnm2aT3YF8" alt="" width="375"><figcaption><p>BUG-XZ 例子</p></figcaption></figure>

如图所示。这个题相较于前面各种牛鬼蛇神来说，它反而比较纯粹：它就两个真数。只不过比较特殊的是，这两个真数数字不一样，而且也不在同一个行列宫（互相都看不见对方）。

这也能构成删数吗？是的。不过这里我们要借用一个额外的辅助双值格来完成这个事情：`r1c8`。这个单元格位于其中一个真数的所在列上，且这个双值格只有 2 和 4，恰好跟真数用到的这两个数字是一样的。

如果我们把思路串起来，就能简单得到类似于 XY-Wing 那般的逻辑：

* 如果 `r4c1 = 2`，则删数 `r1c1 <> 2` 直接成立；
* 如果 `r2c8 = 4`，则由于同列的 `r1c8` 仅存在两个候选数 2 和 4，所以 `r1c8 = 2`，照样可以得到 `r1c1 <> 2` 的结论。

也就是说，它迂回了一个步骤，即延长了 `r2c8(4)` 这个真数填写的逻辑。这个题的结论是 `r1c1 <> 2`。

我们把这个结构称为全双值格致死解法的 **XZ 逻辑**（Bi-value Universal Grave XZ Rule，简称 BUG-XZ）。这里的 $$X$$ 和 $$Z$$ 其实指的是两个未知数。在这个例子里，$$X=4, Z = 2$$。那为什么非得是 $$X = 4$$ 呢？这是因为老外定技巧名称的时候，习惯把 $$Z$$ 当成删数，而这个题的删数是 2，所以自然 $$Z = 2$$ 了。

这还比较容易理解。我们再来看一个例子。

<figure><img src="/files/YoIIvtQ97IzzDJMehEXq" alt="" width="375"><figcaption><p>另外一个 BUG-XZ 的例子</p></figcaption></figure>

如图所示。和前面的推理是一样的，这里就不解释了。

## 一些极限问题 <a href="#questions-about-extremum-values" id="questions-about-extremum-values"></a>

最后在结束这篇文章之前，我们先来看两个理论层面的问题。

### 问题 1：这个技巧最少由多少个单元格构成？ <a href="#question-1" id="question-1"></a>

我直接说答案吧。全双值格致死解法最少需要 11 个单元格构成。这个数比较难以从数字本身上猜出来，因为它非常不像是一些常见常数那样容易被“触发”到。

下面我们来看一个例子，只有 11 个单元格的情况。

<figure><img src="/files/fkEh4UZXlcANzvlFlZvm" alt="" width="375"><figcaption><p>只有 11 个单元格的情况</p></figcaption></figure>

如图所示。

另外，如果想问最多需要多少个单元格构成的话，很抱歉的是，这个结果我也不清楚。这个结果可能需要借助一下计算机的计算或复杂的理论证明才能得到。这个问题就交由给读者自己思考了。不过目前来看，似乎这个数会比较大，我甚至遇到过二三十个空格的情况。下面给的这个例子具有 32 个空格，也可以使用这个技巧；不过它需要一些特殊手段删掉一些候选数才能走到这里。

<figure><img src="/files/Kn7znr5E23Es1F9UrOvF" alt="" width="375"><figcaption><p>有 32 个空格的大型 BUG 类型 1</p></figcaption></figure>

### 问题 2：这个技巧最多可以有多少个真数构成？ <a href="#question-2" id="question-2"></a>

这个也很抱歉。这个我也不清楚。如果你要问的是可以提供删数的，那么目前发现的是 7 个；8 个及以上的暂时没有验证过，它应该理论是存在的，只不过因为极为罕见的缘故很难被我们遇到。我曾使用计算机跑了一周，得到了若干题目里，其中只有三道 BUG + 7 的题目，暂时没有更大的情况。

不过要注意的是，如果真数存在且能提供删数的盘面状态下，也可能存在其他技巧，例如 XY-Wing 什么的。如果你使用了他们，甚至可能会绕过这个技巧的使用，上述我提及的三个例子都是不能绕过的，或者需要不是当前学到的知识点的、更复杂的技巧才能绕过。

另外，如果你只是想挑战下极限，单纯想看看这个技巧可以有多少个真数，而并不要求真数是否生效，也不考虑是否被其他技巧所代替的话（就单纯想看看真数的最大情况），这个数虽然我也不清楚它的精确值，但它目前发现到的最大值，也比 7 大，甚至大很多。

下面给各位展示的是一个 BUG + 122 的例子。

<figure><img src="/files/NjKtfwVVFF8wPVAzVe53" alt="" width="375"><figcaption><p>BUG + 122</p></figcaption></figure>

其准确的数值并不清楚。这个最大值理应取决于一道题能具有的最多的候选数的多少。如果一个题候选数越多，那么它如果能形成这样的盘面状态，那么真数也就会越多。一般正常的数独题能具有 180 到 200 个候选数这个范围里面（这里指的是直观技巧填完之后在不删除任何候选数的情况下，形成的这个盘面状态）。当然，这只是一般情况，一些题可以略微超过这个极限值；但在极少数题里甚至还会超过很多，比如这个题就有 236 个候选数，所以它拥有 $$236 - (81 - 24) \times 2 = 122$$ 个真数，是目前为止发现的最多的情况。

至此，这个技巧的内容也就全部结束了。下面我们将进入到新的技巧学习之中去。


# 欠一数组（ALC）

Almost Locked Candidates

下面我们将进入新的技巧的学习。前面我们一连学习了五种不同的致命结构技巧（利用唯一解的技巧），我们休息休息，将推理逻辑回归到普通的矛盾上去。

## 标准类型 <a href="#standard-type" id="standard-type"></a>

### 欠一数对（Almost Locked Pair） <a href="#almost-locked-pair" id="almost-locked-pair"></a>

<figure><img src="/files/LQS1gKADxkmixWqLk9fL" alt="" width="375"><figcaption><p>欠一数对</p></figcaption></figure>

如图所示。请注意图中 `r7` 和 `b8` 两个区域。

我们发现，在 `r7` 里，数字 1 和 6 整体只能填入到 `r7c345` 三个单元格里；而其中的 `r7c45` 均位于 `b8` 里。那么我们不妨作出这样的假设。我们发现，`r9c6` 这个单元格只要填入了一个数，不论是哪个数，因为都是 1 或 6 的关系，那么 `r7c45` 都无法填入这个数字。而因为 `r7` 上必须填入一个 1 和一个 6，所以 `r7c345` 三个单元格的其中两个单元格都需要被 1 或 6 所占据。

而且，由于 `r7c45` 里 1 或 6 的其中有一个数会填不进去的关系，那么我们只能知道的是，`r7c3` 必须承担起填入 1 或 6 的责任，以确保 `r7c45` 只用再填一个数，结构就可以“稳定”下来了。所以，`r7c3` 必须是 1 或 6 的其一。那么结论就是 `r7c3 <> 29`……吗？

别急。别着急下结论。刚才我们说到，`r7c3` 必须是一个 1 或 6 的其中一个数（假设我用字母 $$a$$ 来表示），而 `r7c45` 只能拿出其中一个单元格填一个数（假设用字母 $$b$$ 来表示），这是不是很像是之前比如说唯一矩形类型 3 里的那种摆放状态？

因为 $$a$$ 和 $$b$$ 此时均是 1 或 6 里的数（而且 $$a \neq b$$），所以，按道理来说，`r7` 的 `r7c345` 会有其中两个单元格形成关于 1 和 6 的隐性数对；而借用这一点，将视角回溯到 `r9c6`，我们还能发现神奇的现象。因为 `r7c45` 只能填一个 $$b$$，所以 `r9c6` 只有 1 或 6 的话，那岂不是它只能填 $$a$$？是的，我们甚至还可以更进一步地得到，`r7c3 = r9c6` 这个填数关系。当然，这个填数关系似乎没有什么好用的结论（最多也就影响你后续填入了其中一个单元格后，立马可以把这个数填在另外一个单元格上）。不过，我们主要想得出的是 `r9c6` 填 $$a$$ 的结论。因为这样一来，`b8` 也会有一个数对，一个显性数对，用的是 `r7c45` 和 `r9c6` 的其中两个单元格。所以，`b8` 里的其余单元格都不能填入 1 或 6。所以，这个题的结论是 `{r8c456, r9c4} <> 16` 和 `r7c3 <> 29`。

我们把这种用到一个行/列和一个宫的组合，并带有一边显性数组一边隐性数组的这种特殊结构称为**欠一数组**（Almost Locked Candidates，简称 ALC）。图上这个例子是欠一数组的最低规格的情况，因为是数对，所以叫**欠一数对**（Almost Locked Pair，简称 ALP）。

> 这里要稍微注意一下的是，在英文名里，欠一数组这个技巧的英文名用的单词是 Locked Candidates，即区块，而并不是数组，这是因为国外的数独圈子里，他们更倾向于将这个技巧结构看作是区块的延伸（如不看 `r7c3` 的话，数字 6 就称为了区块，并会影响到 `r9c6` 的填数，比较符合区块的长相和推理过程）。而我们这边的圈子更看重假设成 $$a$$ 和 $$b$$ 参与讨论的情况，所以更符合数组一些。不过这都不是很重要，搞清楚结构的长相，叫什么都行。

下面我们再来看一个欠一数对的例子，用于巩固，以便你能理解它。

<figure><img src="/files/4dz4NykKxFkUGsVLwF5q" alt="" width="375"><figcaption><p>欠一数对，另外一个例子</p></figcaption></figure>

如图所示。这个例子就自己看一下了。

### 欠一三数组（Almost Locked Triple） <a href="#almost-locked-triple" id="almost-locked-triple"></a>

下面我们来看三数组的情况。

<figure><img src="/files/w7FuKS0U463WZdamIBB8" alt="" width="375"><figcaption><p>欠一三数组</p></figcaption></figure>

如图所示。这次我们把视角切换到 `r6` 和 `b6` 上。

可以看到，`b6` 里有 `r4c8`、`r5c7` 和 `r6c78` 一共四个单元格可以填入 1、5、6，其中 `r6c78` 还位于 `r6` 上。

和之前假设一样，我们还是从显性这边开始。由于 `r6c12` 里只能是 1、5、6 的其中两种数字，所以我们不妨假设他们为 $$a$$ 和 $$b$$，那么为了确保 `b6` 能够正常摆放下 1、5、6 三种数字，我们只能让 `r6c78` 的其中一个单元格填入 $$c$$（此时 $$abc$$ 均是 1、5、6 里的数，且互相都不相等）。

于是，由于 `r6c78` 只有一个单元格填 1、5、6 的其中一个数，所以 `r6c1278` 的其中三个单元格将会构成显性三数组，而 `r4c8`、`r5c7` 和 `r6c78` 的其中三个单元格将构成隐性三数组。这里要稍微注意一下，由于我们无法确定 `r6c78` 的其中哪一个单元格是 1、5、6，所以删数结论并不会在这两个单元格里产生，毕竟这并不确定。

所以，这个题的结论就是 `r4c8 <> 3`、`r5c7 <> 4` 和 `r6c46 <> 56`。其实按理说 `r6c46(1)` 也能删，但是这候选数不存在是因为这个盘面状态之前，已经有 1 的区块（`r4`）把它给干掉了。

我们把这个带三数组的状态，称为**欠一三数组**（Almost Locked Triple，简称 ALT）。

下面我们还是老规矩，再看一个例子。

<figure><img src="/files/ueOLcSqC2jFkSQYoo5T9" alt="" width="375"><figcaption><p>欠一三数组，另一个例子</p></figcaption></figure>

如图所示。这个题也自己看。要注意的是，这个题长得比较简单，但是并不影响推理。

## 带有明数的类型 <a href="#value-type" id="value-type"></a>

前面的例子，我们都能比较容易地理解。下面我们来看，借用假设字母时使用明数的类型。所谓**明数**（Value），其实就是提示数和填入数的统称，即这个单元格此时不是空格的状态，但它具体是初始就有的提示数信息，还是自己填的并不重要；明数早期也叫**确定值**，即当前确定的数值。

> 可以从名字看出，有明就有暗。所谓暗数，肯定指的就是候选数了。是的，暗数就是候选数的别名。不过这里我们就不改了，毕竟候选数用的次数也比较多了。

### 带有明数的欠一三数组 <a href="#almost-locked-triple-with-value" id="almost-locked-triple-with-value"></a>

<figure><img src="/files/hxFlQz9tB0mvsSldOBe8" alt="" width="375"><figcaption><p>明数欠一三数组</p></figcaption></figure>

如图所示。我们发现，`c4` 里，`r3c4` 只有候选数 7 和 8。如果它填了一个数进去，那么此时 7 或 8 就不能填在 `r78c4` 之中，于是这个数就会落到 `b8` 里的 `r78c6` 之中。

不过和刚才的例子有所不同的地方是，这次我们再也无法确定 7 和 8 的具体填数位置，因为此时 `b8` 里能填 7 和 8 的地方一共有四个单元格而不是原始欠一数对那样只有三个单元格。

这有些麻烦了。但是我们仔细再观察一下，似乎数字 1 也可以纳入到欠一数组的结构里来。如果纳入进来的话，相当于就是说 `r78c46` 四个单元格其中必须填 1、7、8 三种数字。这就合适了：因为刚开始我们有 `r78c4` 只能有一处填 7 或 8，而 1 纳入后，1 会占用这四个单元格的其中一个名额，`r78c4` 占一个名额，剩下呢？剩下就是 `r78c6` 里不填 1 的另外那一个单元格，这样就刚好能放下三个数字 1、7、8。

很好。这样我们就保证了 1、7、8 都放得下了。所以结论呢？由于我们先填了一个数在 `r3c4` 里，所以先假设它是填的 $$a$$。然后，我们可以得到 `r78c4` 里必须有一个 $$b$$。然后，`r78c6` 里必须是一个 $$a$$ 和一个数字 1。所以，结论就是，`r2c4 <> 78` 和 `r78c6 <> 234`。

这里我们借用了数字 1 必须填在 `r78c46` 里。但实际上我们看得到的是，`r78c46` 里其实就只有 `r78c6` 右边这两个单元格可以填 1。显然，由于 `c4` 早就已经有 1 的明数出现，所以压根也放不了 1，所以我们只能把这个 1 视为共轭对一般的存在，相当于给结构打了个补丁，以便支持推广的形式。这是一般的理解方式。

不过，你也可以这么去理解它：哪怕 `r4c1` 的这个明数 1 它是以候选数形式存在的，这个欠一数组结构仍然是成立的。比如说，`r4c1` 此时不再是明数 1，而 `c4` 还存在一个单元格只有候选数 1、7、8。然后我们为了让这个 1 不能直接通过排除出数而破坏掉结构，我们再给 `r3c4` 补上候选数 1。此时，这个结构就会变为一般的欠一三数组。结构的结论仍然是成立的，甚至删数大多都不会变（当然，1 可能会新增删数）。所以，这个例子实际上就可以被视为是欠一三数组，但是数字 1 处于确定在某一个固定的格子里的特殊状态。所以这种类型也称为明数类型。

可以看出，明数类型在删去固定的这个明数后，实际上用的数字本身就只有 7 和 8 两种数，它已经是最小规格的情况。因此，明数类型等价于标准版本的欠一数组来看，起步就是三数组。

下面我们再来看一个例子。

<figure><img src="/files/6ZnZj83eFF5NKvBblb4v" alt="" width="375"><figcaption><p>明数欠一三数组，另外一个例子</p></figcaption></figure>

如图所示。这个例子和前面那个完全一样，所以就留给你自己看了。

### 带有明数的欠一四数组 <a href="#almost-locked-quadruple-with-value" id="almost-locked-quadruple-with-value"></a>

由于明数的特殊性，所以欠一数组具有四数组的状态。

<figure><img src="/files/29mk9hlNwQCPdDMWhdwS" alt="" width="375"><figcaption><p>明数欠一四数组</p></figcaption></figure>

如图所示。和前面一样。我们先看成欠一三数组的状态。可以发现，`c7` 里，单元格 `r12c7` 只有候选数 2、3、7。所以，这两个单元格最终只能填入数字 2、3、7 的其中两个。于是，这两个数字都不能出现在 `r89c7` 之中。而由于我们还需要确保 `b9` 里数字 2、3、7 填入正常，而 `r89c7` 此时最多只能填一个 2、3、7 的数字进去（还不能和 `r12c7` 填的一样）。所以，`r7c89` 和 `r8c8` 里必须安插两个位置填上跟 `r12c7` 一样的数字。

而我们还发现，数字 5 在 `b9` 里只能填在 `r7c89` 和 `r8c8` 里，所以里面还得有一个单元格被 5 填入。所以整体来看，能摆成功的唯一状态是这样的：`r12c7` 填入的数字是 $$a$$ 和 $$b$$，然后 `r89c7` 只能填一个 $$c$$ 进去（此时 $$abc$$ 是 2、3、7，且互不相等）。然后，`r7c89` 和 `r8c8` 里有一个单元格填 5，剩下俩是 $$a$$ 和 $$b$$。所以，这么看起来，`c7` 里会有关于 2、3、7 的显性三数组出现，而 `b9` 里则会出现 2、3、5、7 的隐性四数组（别忘了 5 也在其中）。所以删数结论是 `r456c7 <> 37` 和 `{r7c89, r8c8} <> 19`。

当然，和前面也是一样的。你也可以将 `c7` 里已经存在的明数 5 视为候选数状态，然后这就好比是一个关于 2、3、5、7 的**欠一四数组**（Almost Locked Quadruple，简称 ALQ）结构，所以我们把这个称为带明数的欠一四数组。

下面我们再来看一个例子。

<figure><img src="/files/NeURrTgwyuhfD5EVOJNC" alt="" width="375"><figcaption><p>明数欠一四数组，另一个例子</p></figcaption></figure>

如图所示。这个例子更为特殊。它直接用了两个明数。推理方式也是完全类似的，首先假设 `c4` 里填 3 和 9 的情况，可以得到 `r23c4` 不能填这个数，于是这个数就会落入 `r2c5` 和 `r3c56` 的其中一个单元格里。而我们还发现由于 2 和 5 只能摆在这三个单元格之中，所以一个 2 一个 5 就占用了两个单元格，所以刚好只能再放得下一个位置填和 `r5c4` 一样的填数。

欠一数组的内容我们就介绍完毕了。


# 融合待定数组（SdC）

Sue de Coq

在前一节的内容里我们学习了欠一数组的内容。今天我们继续来讲数组的拓展。

## 标准类型 <a href="#basic-type" id="basic-type"></a>

<figure><img src="/files/diHWStA9DwkoTKVNS6ir" alt="" width="375"><figcaption><p>标准类型</p></figcaption></figure>

如图所示。请着重关注 `b6` 和 `c8` 里的单元格。

可以看到的是，`r46c8` 是这两个区域的交集上的单元格，并且，绿色全部涂的是 7、8、9 三种数，而橙色全部涂的是 3 和 5 两种数。仅用这两种配色，我们可以将 `r4c78`、`r5c9` 和 `r68c8` 这五个单元格的所有候选数都涂上色。

涂色的作用是方便区分数字。显然，7、8、9 在这五个单元格里只出现在 `b6` 之中，而 3 和 5 只出现在位于 `c8` 的单元格之中。这意味着，数字在这五个单元格里怎么排列填数的时候，数字都不会出现两次。

数一下单元格数量，一共有 5 个单元格；而数数出现的数字种类数，也恰好是 5 种不同的数字：3、5、7、8、9。“不同的数字”这一点很重要。数字在这五个单元格里摆放既然不可能填入重复项，还需要保证数字填满全部的五个单元格，那就说明了一点：每一个数都会在这五个单元格里出现恰好一次。

得到这一点后我们就会发现它会很有用。比如说，在 `b6` 里，7、8、9 必须在 `r4c78`、`r5c9` 和 `r6c8` 的其中三个单元格里填入各一个，所以 `b6` 的其余单元格都不可能填 7、8、9，所以对于 `b6` 而言，其他单元格的候选数 7、8、9 都可以删除；而对于 `c8` 而言，由于数字 3、5 必须在 `r468c8` 的其中两个单元格填入各一个，所以 `c8` 的其余单元格也都没有机会填入 3 或 5，于是其他位置的候选数 3 和 5 均可删除。

因此，这个题的结论是 `r46c9 <> 89, r6c7 <> 9, r5c7 <> 79, r5c8 <> 78, r7c8 <> 35`。

我们把这个技巧称为**融合待定数组**（Sue de Coq，简称 SdC）。这个技巧名称比较特殊，它并不是直接从英文名翻译来的。它的英文名 Sue de Coq 也不是纯正的英语，而是一位叫这个网名的网友发帖，解释了这个技巧的推理逻辑。后来为了纪念他对数独圈子的技巧研究的贡献，就直接用了网名作为这个技巧的名称。

下面我们来看看另外一个例子。这是之前欠一四数组的例子，不过我们这次使用这个技巧来解决它。

<figure><img src="/files/R7aOYxbbUQdHlsFx2y8h" alt="" width="375"><figcaption><p>另外一个例子</p></figcaption></figure>

如图所示。这个例子就自己推理了。推理方式和前面完全一样，只是位置稍微改了一下而已。

别急。这种结构还挺有趣的。我们来看一下，这个结构的极端例子。

<figure><img src="/files/5BSBoBcMn56yOpiGbsG1" alt="" width="375"><figcaption><p>最大规格的融合待定数组</p></figcaption></figure>

如图所示。这个例子也是标准版的，不过用的单元格会特别多。实际上它是最大的情况。因为数字需要不跨区不重复地出现，所以很容易就想得到，这种结构最大的规格肯定是 9 个单元格，把从 1 到 9 全部数字都用一遍。

## 孤立数字类型 <a href="#isolated-digit-type" id="isolated-digit-type"></a>

<figure><img src="/files/hNxpN4Js6ZGOfCSbjI9E" alt="" width="375"><figcaption><p>孤立数字类型</p></figcaption></figure>

如图所示。这次我们发现配色多用了一种颜色：蓝色的数字 4。

和前面的推理几乎一致的是，这个结构一共使用了六个单元格，其中绿色的数字是 2、7，橙色数字是 3、5、6，蓝色数字是 4，三种配色一共是六种不同的数字。也和前面一样的是，只需要用这三种配色，就可以完全把所有六个单元格的候选数都涂上颜色，没有遗漏。

显然，数字数量和单元格数量完全一样，而且每一个数字都有它自己的归属。和前文完全一样的是，橙色数字 3、5、6 只会出现在这六个单元格里位于 `c9` 的单元格之中；而 2 和 7 只会出现在 `b9` 的单元格之中，4 则比较特殊，它只出现在同时位于 `b9` 和 `c9` 的单元格里。

既然有了数字数量和单元格数量完全一样的规则，而且数字又不会“跨区域”出现，那么自然每一个数字都会在其中出现恰好一次。所以，我们能保证的是，`c9` 里的单元格 `r1279c9` 的其中三个单元格必须安排 3、5、6 各一个，`b9` 里的单元格 `r789c9` 和 `r9c7` 的其中三个单元格会安排 2 和 7 出现各一个，并且在 `r89c9` 的其中一个单元格安排填一个 4，这样恰好就填完了所有六个单元格。

所以，这个题的结论就是，`r4c9 <> 345, r7c8 <> 2, r9c8 <> 24`。需要注意的是，因为 4 必须在 `r89c9` 里填一个，所以它好比类似于之前学到的唯一矩形类型 2 一般，由于区块成立，所以按区块的方式同时删掉两个区域下的这个数字，因此这个题里才会既有 `r4c9 <> 4` 又有 `r9c8 <> 4`。

这是融合待定数组这个技巧里比较特殊的一种，它的推理并不会有变化，但主要的不同点体现在这个 4 最终形成了区块。我们把这个 4 称为融合待定数组的**孤立数字**（Isolated Digit）。

下面我们再来看一个例子。

<figure><img src="/files/Og9ysA8INJcpR2iwByUb" alt="" width="375"><figcaption><p>孤立数字，另外一个例子</p></figcaption></figure>

如图所示。这个例子也希望你自己推理。

## 自噬类型 <a href="#cannibal-type" id="cannibal-type"></a>

<figure><img src="/files/ff7vnEUuUQlKgoLyay2Z" alt="" width="375"><figcaption><p>自噬类型</p></figcaption></figure>

如图所示。这个例子会稍微改动一下前面融合待定数组的推理过程。

这个例子里，橙色的数字是 2、5、8、9 四种数字，而绿色是 1、6、7、8 四种数字。可以发现的是，数字 8 同时在 `c4` 和 `b8` 里出现，其他数字则和之前的一样，没有重复的。

倘若我们强行按之前的逻辑来理解它的话，我们会发现一个神奇的现象。数一下这个结构用到的单元格数量：`r123789c4` 和 `r9c56`，一共有 8 个单元格。数字 8 在两个区域里重复了一次，所以实际上就 7 种不同的数字，但是却有 8 个单元格。这说不过去了。显然，7 种不同的数字要填到 8 个不同的单元格之中，势必会有至少一个数字会出现两次及以上的。

显然，这个数字 8 重复的情况，反而是这个例子里最合适的存在。因为所有其他的数字都不可能出现重复填入，而就这个 8 刚好可以重复填。现在我们要重复填了，那这个 8 就可以发挥它重复填的功劳。所以，这个例子里，8 必须填两次。

那么，在和之前融合待定数组的逻辑对比起来，这个例子需要满足的地方有两点：

* 所有除了数字 8 外的数都必须恰好填入到这 8 个单元格里各一个；
* 数字 8 在这 8 个单元格里填必须两个。

那既然要让 8 填两次，那么肯定就不能让它填在 `r789c4` 之中。因为这里是 `c4` 和 `b8` 交叉的位置上。它填进去一次就相当于填一个就满足两个区域填了这个数的需求，但这显然不符合我们的要求。所以，反倒是不在这三个单元格上的位置需要填两次。我们把 `r123c4` 算一组，`r9c56` 算另一组，那么这两组各需要让出一个位置填 8，这样就可以填两次 8 了。

所以， 这个题的结论是 `r5c4 <> 59, r7c5 <> 78, r78c6 <> 8, r789c4 <> 8`。

下面我们再来看一个例子。

<figure><img src="/files/a0fgTXR0ZqUtkIszsEIc" alt="" width="375"><figcaption><p>自噬类型，另外一个例子</p></figcaption></figure>

如图所示。这个例子就自己推理了。

至此，我们就介绍完了全部的融合待定数组的内容。


# 跨区数组（DDS）

Distributed Disjoint Subset

为了衔接后续的内容，又可以把内容按难度合理拆分，这里加上一个短篇过渡的内容。

## 跨区数组的定义 <a href="#defintion-of-distributed-disjointed-subset" id="defintion-of-distributed-disjointed-subset"></a>

前面我们学到了融合待定数组的技巧。这个技巧的推理方式是使用一个宫，以及一个和他有交集的行列。取出这两个区域里的若干单元格，让单元格内的所有数字在所有这些格子里的填数分布都不会出现两次。但，我们并没有强调一个点（虽然之前其实也在用）。这一个点会在这篇内容里放大。

先来看一个例子。

<figure><img src="/files/SEzIBGWnPj1D21EuAH3O" alt="" width="375"><figcaption><p>跨区数组例子</p></figcaption></figure>

如图所示。我们选取四个单元格 `r34c34`。我们发现，里面出现的数字有 1、4、6、8 四种，但是他们在四个单元格里的分布和之前融合待定数组完全一样，没有任何一个数字可以填两次，都只能最多填一次。

只是这个例子比较特殊的点在于，这个例子并不是一个宫和一个行列，而是两行两列。我们发现，四种数字要填入到四个单元格里，按理说这一点在之前数组的内容里有所提及：如果单元格数和里面出现的数字种类数完全一样的话，那它就是数组。数组的结论就是，按数组所在的区域进行删数。

可这个直接当数组看似乎并无不妥，只是出现的位置并不是数组那样全都在同一个区域里，这唯一有所不同的地方。不过，在我们之前介绍了融合待定数组的内容后，我们清楚地知道，因为里面的数字并不会出现两次，所以每一个数都有机会往里面填入。而四个单元格又保证了填入的数字必须得 4 个，所以 1、4、6、8 每一个数都会填入一次，这样才有了和数组一样的结论。

那么删数呢？因为我们论证这种结构的合理性具有“每一种数字都能填一次”的规则，所以删数理应会按数字为单位进行删数。比如说，这里的数字 1 肯定只能填在 `r34c4` 之中，因此 `c4` 里的其他单元格都不能填 1，所以有 `r8c4 <> 1` 的结论；而 4、6、8 其他三种数字同理。

我们把这种像是数组又不在同一个区域的结构称为**跨区数组**（Distributed Disjoint Subset，简称 DDS）。从跨区数组的名称里可以看出，它指的是数字在结构里不会填多次，即“同一个数字不会跨区出现多次”。

> 另外，这个题里和结构中心对称的 `r67c67` 四个单元格也是一个跨区数组。你可以自己看看然后找下删数有哪些。因为完全对称，所以我就不展示新的配图了。

另外，跨区数组和数组所满足的规则近乎一样，只是因为跨区数组的数字会出现在不同的区域，所以可能会存在跨区的效果，因此跨区数组的成立条件会比普通数组多一点。

如果一个结构是跨区数组，则它需要满足如下两点：

* 单元格数量和里面出现的数字种类数要一样多；
* 所有出现的数字，在这个结构里最多只能填一个。

对于第二点来说，这是比较关键的一点。由于普通数组里，第二点是客观成立的，所以这看起来就像是一句废话。但是回顾你之前学习数组的时候，这一句话也并不是废话。只有不能重复填入相同数字，才能保证数字都会出现一次。

可以从这两点看出，之前介绍过的融合待定数组也是满足跨区数组的定义的。实际上，融合待定数组确实属于跨区数组的其中一种情况。

## 跨区数组和普通数组的“孽缘” <a href="#relations-between-distributed-disjointed-subset-and-normal-subset" id="relations-between-distributed-disjointed-subset-and-normal-subset"></a>

### 区块数组（Semi-Locked Subset） <a href="#semi-locked-subset" id="semi-locked-subset"></a>

在学数组的时候，我们并未提及这种删数模式。实际上在早期的教程里，我是把他放在和数组的内容一起说的，因为它不难学会，也确实符合数组的介绍内容（只是个删数层面的推广罢了）；但是新写的教程，我反复思考了很久，考虑到内容体系化的说法，最终还是决定放在了这里进行讲解。

回到之前数组的篇章中来。既然我们说到了跨区数组和它的删数规则，那么我们就可以将数组的删数逻辑进行严格推广。

<figure><img src="/files/lIrglwWnAdrCYlQZ7jgE" alt="" width="375"><figcaption><p>区块三数组</p></figcaption></figure>

如图所示。这是一个很稀松平常的显性三数组。但是删数有些奇怪，数字 4 删了两个区域，一个是 `c4` 里的标准删数，一个是 `b5` 里。

数字 3、6 不用多说，主要是 4 的删数较为奇怪。但是仔细观察就不难发现，虽然这个数组是长在 `c4` 里的，但是实际上 4 也只出现在了 `r45c4` 之中。这说明了 4 在这三个单元格里只可能填在 `r45c4` 里。

还记得刚才才说过的定义吗？跨区数组的第二点。第二点说，因为我们知道所有的数字都只能最多在里面填一个，而因为数字种类数和单元格数一样多，所以每一个数都有填入的机会。那么 4 也不例外。而此时，4 的位置又恰好只可能在 `b5` 之中。这说明了，`b5` 里填 4 的机会会被这个三数组所占据。说人话就是，因为 4 必须填在 `r45c4` 里，而这两个单元格恰好同一个宫，因此，`r56c6 <> 4` 的结论是成立的。

这便是数组内部带有区块的特殊删数模式。我们把这种显性数组称为**区块数组**（Semi-Locked Subset）；这个例子是三数组，所以细致一点也可以叫**区块三数组**（Semi-Locked Triple）。我们再来看一个例子。

<figure><img src="/files/bJlSKZ3yHbeRsWyN9fM7" alt="" width="375"><figcaption><p>区块四数组</p></figcaption></figure>

这个例子是一个显性四数组，不过数字 1 和 4 都只存在于区块的范畴里，所以它也可以使用区块的逻辑在两头（两个区域同时）进行删数。不过细节就不解释了。

这个叫**区块四数组**（Semi-Locked Quadruple）。

### 死锁数组（Locked Subset） <a href="#locked-subset" id="locked-subset"></a>

再极端一些。既然数组的其中一个或一些数字卡在区块的范畴里，我们叫区块数组的话，那么所有数字都卡在区块的范畴里呢？

<figure><img src="/files/ZuPz92SIdg058USXPzqz" alt="" width="375"><figcaption><p>死锁数对</p></figcaption></figure>

叫**死锁数组**（Locked Subset）。所有的例子我都不用解释了。相信你能看到这里，基本就能说明你是看得懂的。上面这个规格的叫**死锁数对**（Locked Pair）。下面我们来看个**死锁三数组**（Locked Triple）。

<figure><img src="/files/vuwfrwnnflVlNyAjPRiS" alt="" width="375"><figcaption><p>死锁三数组</p></figcaption></figure>

因为区块最多三个格子，所以死锁数组最大规格也就到 3 结束。

好了。跨区数组的内容就到这里。下一节我们继续延续跨区数组的推理思路。


# 伪数组（ESP）

Extended Subset Principle

在前面的内容里，我们知道跨区数组所需要满足的点一共有两点。第一点是格子数和用到的数字种类数量一致，第二点则是每个数只能最多出现一次。

而对于第二点，我们认为数组的定义范围下都是需要满足的特性。下面我们来看这个第二点不满足，却满足第一点的结构都应该怎么推理。

## 基本推理 <a href="#reasoning" id="reasoning"></a>

<figure><img src="/files/N2yMejC1tqJ4lTdZ9PP8" alt="" width="375"><figcaption><p>伪数组，第一个例子</p></figcaption></figure>

如图所示。可以看到，这个结构一共用了 5 个单元格：`r5c2359` 和 `r6c2`。数一下里面的数字种类，一共也有 5 个：1、4、5、7、8。

这似乎基本满足了跨区数组的规则。但是很遗憾的是，这个例子里，五种不同的数字里，数字 7 出现了特殊状态：它跨区了。这里的跨区肯定说的是 7 不再满足最多填入一个的规则。很显然，我们完全可以安排数字 7 同时填在 `r5c9` 和 `r6c2` 上，这照样不会有问题。因此，因为数字 7 的特殊性，整个结构就不再满足第二点特征，所以它不是一个跨区数组。

但是，先别着急因为不是跨区数组就后悔错过了删数。这个结构仍然有删数。虽然 7 不满足条件，但 1、4、5、8 剩下四种数字确实是最多只能填一个的。由于题目里其他数字都只能最多填一个，所以结构里的数字 7 必须至少填一个。

有人问为什么。其实很简单，因为数字 1、4、5、8 只能最多填一次，所以四个数算上也最多只能占四个单元格。整个结构用了 5 个单元格，还剩下一个必须填的是 7。要不然你就填俩 7 进去，然后让 1、4、5、8 的其中一个数填不了也行，毕竟说的是 1、4、5、8 是*最多*一次。

总而言之，数字 7 不填结构放不满 5 个单元格，所以会有矛盾。所以 7 必须填至少一个。于是，结论就有了。我们按之前学到的类似 XYZ-Wing、WXYZ-Wing 那样的删数逻辑来看它就行。找所有 7 都“看”得到的地方。

显然，本题里只有 `r5c1` 满足条件，因此结论就是 `r5c1 <> 7`。

我们把这个结构称为**伪数组**（Extended Subset Principle，简称 ESP），象征着它差点就满足跨区数组的规则了，但因为有一个“瑕疵”导致它无法按跨区数组的模式进行删数，但处于一种不是跨区数组却仍旧有删数的特殊状态。伪数组的英文名如果直译的话，是翻译成“数组原理拓展”，即拓展了数组的推理逻辑，衍生出来的技巧。

下面我们再来看一个例子。这个例子是 4 个单元格。

<figure><img src="/files/XDgnt4nI5MNhcvFm6kau" alt="" width="375"><figcaption><p>伪数组，第二个例子</p></figcaption></figure>

如图所示。这个例子就自己看了，逻辑完全和前面的一样。

## 在行和列上的伪数组 <a href="#extended-subset-principle-on-lines" id="extended-subset-principle-on-lines"></a>

下面我们来看一下，伪数组在行和列上的情况。

<figure><img src="/files/eXQI9QvRyUwD2JaLkhrP" alt="" width="375"><figcaption><p>伪数组，第三个例子</p></figcaption></figure>

如图所示。数一下数字的种类数：1、2、3、4、6 一共有五种，再数数单元格数量：`r1c156, r67c5` 也是五个。非常 nice，它和之前的例子完全一样，只是把宫给干掉了，改成了行+列的组合。所以它满足跨区数组的第一点。

第二点呢？似乎只有数字 3 是可以填两次的，其他的最多就能填一次。那么我们也试试用伪数组的思路去理解，看看可不可以。

显然，数字 3 如果不出现的话，1、2、4、6 是不足以填到五个单元格里的，因为他们每一个数都最多只能填一次，所以伪数组的逻辑 OK。删数呢？删数也 OK，这个例子里的删数是 `r2c5 <> 3` 也是存在的。所以，这也是伪数组，只是把结构调了下位置。

## 多种数字可重复的伪数组 <a href="#complex-analysis-on-extended-subset-principle" id="complex-analysis-on-extended-subset-principle"></a>

前面我们介绍的都还算比较简单。下面我们来看分析起来稍微复杂一些的伪数组。

<figure><img src="/files/sJOruzMXA6FHkFCM78p7" alt="" width="375"><figcaption><p>分析稍微复杂一点的伪数组，第一个例子</p></figcaption></figure>

如图所示。仔细数一下单元格数和数字种类数就可以发现，这个例子直接就不相等了。数字种类数有 4、5、7、8 共四种，而单元格一共有 `r1c15, r2c179` 共五个单元格。

这连第一点都不满足了，这还咋推理啊。别着急嘛。我们来看看里面数字的跨区状态。显然，数字 4 和 5 这两种数字是最多只能有一个的，那么问题只出在数字 7 和 8 上：数字 7 和 8 他们最多能往里面填两个进去。

因为我们要填到 5 个单元格里去，强迫 4 和 5 都出现，那也还剩下三个空格未填。简单使用抽屉原理就知道，不论数字 7 填几次，数字 8 肯定都会至少有一次填入的机会的。因为三个单元格要填两种不同的数字，而数字 7 和 8 最多也就能填俩，而就算最多是两个，那保持三个单元格都能正常填数，势必数字 8 会出现至少一次。当然，数字 7 也是至少出现一次的。

所以，删数呢？因为数字 8 至少有一个，所以删数自然就是看所有的 8 都可以看得到的地方。于是，`{r1c8, r2c6} <> 8` 的结论就有了。这个题有关于数字 7 的结论吗？很遗憾的是，因为 7 比较特殊，它出现的位置比较多，导致它没有合理的删数，所以这个题只有关于 8 的结论。

那是否存在两种数都能删的情况呢？显然这个答案肯定是“是”。下面我们就来看一个这样的例子。

<figure><img src="/files/SKGx5XAjZ7hl5FRACKqn" alt="" width="375"><figcaption><p>分析稍微复杂一点的伪数组，第二个例子</p></figcaption></figure>

如图所示。这个例子里一共用了 6 个单元格：`r456c9, r589c8`，数字种类数则是 1、3、4、7、8 共五种数字。显然，3、4、7 是不能跨区的，所以这三个数字最多只能出现一次。

而为了确保单元格放满全部的数字，所以极限一点，把 3、4、7 都填进去，也还剩下三个单元格要填数。所以，1 和 8 势必都会出现（至少一次）。不管是 1 也好，还是 8 也罢，随便哪个数字出现两次都无关紧要，所以，显然数字 1 和 8 肯定是可以用于删数的。

然后我们再来看删数，神奇的一点发生了。数字 1 似乎有删数，因为结构里用的四个 1 都可以看到的地方是 `r4c8` 和 `r8c9` 两处单元格；而数字 8 也有删数，因为结构用到的五个 8 都可以看到 `r4c8`。所以，这个题的结论就是 `r4c8 <> 18, r8c9 <> 1`。这便是同时可以删两种数字的伪数组的特殊状态。

至此，我们就把伪数组的内容介绍完了。


# 均衡数组

Aligned Exclusion

从使用技巧的角度来说，其实这个技巧并不算有任何用的技巧；但对于整合教程而言，本技巧仍然具有一定程度上不可替代的作用。所以才有了这样的技巧。

## 均衡数对（Aligned Pair Exclusion） <a href="#aligned-pair-exclusion" id="aligned-pair-exclusion"></a>

<figure><img src="/files/R2CVwNnja4zPB0mr0zVO" alt="" width="375"><figcaption><p>均衡数对</p></figcaption></figure>

如图所示。请着重假设 `r12c6` 两个单元格。这两个单元格各有三个候选数，所以我们需要对两个单元格的所有可能填写的情况进行排列组合。显然，因为一边三个候选数，所以一共有 9 个情况。我们依次进行列举。

| r1c6 填数 | r2c6 填数 | 填数是否合理 | 原因             |
| :-----: | :-----: | :----: | -------------- |
|    1    |    1    |    ❌   | 重复             |
|    1    |    4    |    ⭕   |                |
|    1    |    8    |    ❌   | 导致 `r9c6` 无数可填 |
|    2    |    1    |    ❌   | 导致 `r1c4` 无数可填 |
|    2    |    4    |    ⭕   |                |
|    2    |    8    |    ❌   | 导致 `r7c6` 无数可填 |
|    9    |    1    |    ⭕   |                |
|    9    |    4    |    ⭕   |                |
|    9    |    8    |    ❌   | 导致 `r3c5` 无数可填 |

在进行了排列操作后，我们发现所有 9 个情况里，组合 (1, 1)、(1, 8)、(2, 1)、(2, 8) 和 (9, 8) 五种组合是错误的填数组合；而很容易地看出，当 `r2c6` 填入 8 时，它能对应的全部组合情况均是错误的。所以，我们可以认为，`r2c6` 不能填 8。所以这个题的结论就是 `r2c6 <> 8`。

我们把这个技巧称为**均衡数组**（Aligned Exclusion）。而这个例子又是两个单元格的情况，所以我们针对于这种情况称为**均衡数对**（Aligned Pair Exclusion，简称 APE）。

另外在数学上，我们把上述这种排列组合的行为称为**笛卡尔积**（Cartesian Product），即两个或多个集合里的元素全部逐一进行排列组合，不论这些集合互相在逻辑、理解和概念上是否有关联，组合起来就完事了。笛卡尔积在生活中的应用非常多，例如说纸牌的各种牌型是花色（4 个）和点数（13 个）的笛卡尔积的结果。

## 均衡三数组（Aligned Triple Exclusion） <a href="#aligned-triple-exclusion" id="aligned-triple-exclusion"></a>

在均衡数对的基础上，我们还可以把结构推广为三个单元格的排列。

<figure><img src="/files/IOwH9hDBkH8EbhT4rBgI" alt="" width="375"><figcaption><p>均衡三数组</p></figcaption></figure>

如图所示。我们针对于 `r1c6`、`r2c12` 三个单元格进行排列。我们可以很容易地发现，因为三个单元格均为双值格，所以假设起来一共有 8 个情况。假设如下：

| r1c6 填数 | r2c1 填数 | r2c2 填数 | 填数是否合理 | 原因             |
| :-----: | :-----: | :-----: | :----: | -------------- |
|  **5**  |    3    |  **4**  |    ❌   | 导致 `r2c5` 无数可填 |
|    5    |    3    |    6    |    ⭕   |                |
|  **5**  |  **5**  |  **4**  |    ❌   | 导致 `r2c5` 无数可填 |
|    5    |    5    |    6    |    ⭕   |                |
|    8    |  **3**  |  **4**  |    ❌   | 导致 `r1c3` 无数可填 |
|    8    |    3    |    6    |    ⭕   |                |
|    8    |  **5**  |  **4**  |    ❌   | 导致 `r2c5` 无数可填 |
|    8    |    5    |    6    |    ⭕   |                |

和前文一样，我们作笛卡尔积后可得到 8 个情况里的其中四个是错误的。并且，我们还发现，错误的四个组合下，`r2c2` 单元格填入 4 时所拥有的、`r1c6` 和 `r2c1` 的所有排列情况均会造成矛盾。因此，这个题的结论是 `r2c2 <> 4`。

我们把这个情况称为**均衡三数组**（Aligned Triple Exclusion，简称 ATE）。

## 均衡四数组（Aligned Quadruple Exclusion） <a href="#aligned-quadruple-exclusion" id="aligned-quadruple-exclusion"></a>

这个结构还有更高的规格，而且可以从结构看出，它似乎并不受任何形式的制约（如必须在同行列宫之类的）。所以，理论上均衡数组的规格可以超过 4。但是，假设的情况也相对应地增大；而且这还是随着空格里候选数的数量，不断求乘积得到的，所以增大的幅度会非常大。不论是对人类思考这种排列情况而言，还是对于电脑进行死板地排列组合而言，也都是不小的工作量。因此，本教程就到四数组就结束。

<figure><img src="/files/AjolyLhspuWQv9cwvEW4" alt="" width="375"><figcaption><p>均衡四数组</p></figcaption></figure>

如图所示。本题需要假设的单元格是 `r7c6`、`r8c27` 和 `r9c4` 一共 4 个单元格。

笛卡尔积假设的情况就全部略过了（不然表格都很长，一共有 54 项）。总之，在假设之后，我们发现，假设 `r8c2 = 7` 时，其他三个单元格的全部 18 种组合都会引发矛盾。所以，这个假设是错误的，故这个题的结论是 `r8c2 <> 7`。

我们把这个规格称为**均衡四数组**（Aligned Quadruple Exclusion，简称 AQE）。

至此，我们就把均衡数组的内容全部讲完了。虽然它看起来仍旧很暴力，但它的本质逻辑“笛卡尔积”并不是一个很难以理解的东西。

## 均衡五数组（Aligned Quintuple Exclusion） <a href="#aligned-quintuple-exclusion" id="aligned-quintuple-exclusion"></a>

<figure><img src="/files/fn5ZvwyRZhVY7dWAH4Rc" alt="" width="375"><figcaption><p>均衡五数组</p></figcaption></figure>

如图所示。这个例子展示了单元格 `r7c9`、`r89c56` 五个单元格的讨论情况。整体讨论了之后造成矛盾的反而只用了 `r7c456` 三个单元格而已。这个例子已经来到五个单元格了，被称为**均衡五数组**（Aligned Quintuple Exclusion）。

## 均衡数组和 Wing 的转化 <a href="#some-aligned-exclusion-can-be-transformed-to-wings" id="some-aligned-exclusion-can-be-transformed-to-wings"></a>

不知道你是否有这种感觉，均衡数组和 Wing 看起来有一些关联。实际上他们确实有一定的转化关系。

<figure><img src="/files/2PAUGqowCqJX488T6ZRE" alt=""><figcaption><p>直接将删数单元格纳入</p></figcaption></figure>

如图所示。左图是残缺 WXYZ-Wing 的样子，右图则是均衡数组的样子。显然右图的意思是想按 9 的排列然后得到 9 全部的组合都无效的结论。不过这种讨论显然和左图的删数思路是刚好反过来的。

当然，这个不总是满足的，因为讨论的单元格并不足够多，有些时候可能需要更多枚举的单元格数量。仅依赖删数单元格肯定是不够的。下面是均衡五数组（刚才的例子）的 VWXYZ-Wing 互相转化视角。

<figure><img src="/files/9BxmXSyBvQQq4UyRMny1" alt=""><figcaption><p>VWXYZ-Wing 和均衡五数组</p></figcaption></figure>

如图所示。


# 烟花数组

Firework Subset

欢迎来到最后一个基础候选数技巧。这个技巧讲解完成后，我们将会进入到下一个大板块之中去。


# 烟花数组的基本推理

Reasoning of Firework Subset

鉴于这个技巧难度较大，所以我们将分两部分来介绍。

## 基础结构 <a href="#pattern" id="pattern"></a>

下面我们来看这个技巧的通用结构。

<figure><img src="/files/0NW9UxYS9xgY6zh8Uami" alt="" width="375"><figcaption><p>烟花数组结构</p></figcaption></figure>

如图所示。这看起来有些奇怪。实际上我们用到的单元格只有 `r1c1`、`r1c9` 和 `r9c1` 三个单元格。

我们先思考一个问题。`r1c9` 和 `r9c1` 能填什么数？看起来 1、2、3、8、9 在候选数列表里，而且这也是直接就在盘面里形成的候选数，应该不可以删除吧？实际上，`r1c9` 和 `r9c1` 只能填 1、2、3，而且 `r1c1`、`r1c9` 和 `r9c1` 三个单元格将构成跨区数组。

这个结论是怎么得到的呢？我们慢慢来说。

## 证明三个单元格只能是 1、2、3 <a href="#prove-of-valid-digits" id="prove-of-valid-digits"></a>

第一点其实比较好得到。如果你看不出来，我们就尝试随意假设一下即可。比如，我们假设右上角 `r1c9 = 9`，看看会如何。

<figure><img src="/files/h06Xa4A2wfQ9q6BVl6aV" alt="" width="375"><figcaption><p>r1c9=9的矛盾</p></figcaption></figure>

如图所示。如果我们允许 `r1c9 = 9` 后，因为 `r1` 此时只有三处空格，所以 `r1c123` 直接形成死锁三数组结构，于是 `r23c1 <> 123`。

但是很遗憾的是，`c1` 需要三个单元格填 1、2、3，但此时在形成死锁三数组后我们只能有 `r19c1` 两个单元格填 1、2、3，是找不出第三个可以放的位置的。所以矛盾了。

同理，`r9c1 = 8` 也会形成这样的矛盾，不过这里就省略了，因为是完全一样的逻辑。

因此，我们就这样得到了 `r1c9` 和 `r9c1` 不填 8、9 的结论；反过来说，实际上 `r1c9` 和 `r9c1`  这个结构例子里长相会比较特殊一些，所以看起来似乎只能有一个多出来的候选数；但是在做题里，只要不是 1、2、3，就可以直接删除。证明思路是完全一样的，毕竟一旦填了不是 1、2、3 的数，另外一侧（比如对于 `r1` 来说，`c1` 就叫另一侧；反之亦然）就一定填不满三个单元格放 1、2、3。所以跟它里面有多少个不是 1、2、3 的候选数没有任何关系，只要不是就可以删除。

> 实际上，这个例子里的 `r1c1` 这个 `r1` 和 `c1` 交叉点的单元格是因为结构“画风”导致无法填入 1、2、3 以外的其他候选数的。实际上，如果它如果在实际例题里是可以存在其他候选数，且仍然能证明得到可以去掉的。不过这里就不证明了，一来是示意图没有这些数，二来是实际例题我会放在下一篇内容里介绍，这里就不展开说明了，就算卖个关子。

## 证明三个单元格是跨区数组 <a href="#prove-of-distributed-disjoint-subset" id="prove-of-distributed-disjoint-subset"></a>

前面的证明相对容易，下面我们来看如何进一步得出他们是三数组的结论。

因为我们是证明跨区数组，所以我们需要保证里面所有出现的数字 1、2、3，每一个数都能且仅能出现一次。那么我们只需要证明“同一个数字一旦放两次就会矛盾”即可。而且，因为这个例子里数字 1、2、3 仅为代号，换言之，证明 1 出现两次能形成矛盾，那么 2 和 3 也就一定也会如此。所以我们只需要证明其中任意一个数即可。

我们拿数字 2 举例。如果让 2 要放两次，显然它只能放在 `r1c9` 和 `r9c1` 之中。于是我们这么试试：

<figure><img src="/files/CAkXU22SHlKPlzNQcXku" alt="" width="375"><figcaption><p>r1c9=r9c1时的矛盾</p></figcaption></figure>

如图所示。当我们要证明这一点时，我们尝试将数字 2 都填入。于是，`r1c1` 此时就只有候选数 1 和 3 了。不过，针对于 `r1c23` 和 `r23c1` 而言会形成矛盾。因为 `r1c23` 此时为确保 1 和 3 能在 `r1` 内填入，所以 `r1c23` 里会有一个单元格是 1 或 3；而 `r23c1` 为确保 `c1` 也能填入 1 和 3，所以也会有一个单元格是 1 或 3。换言之，`r1c23` 和 `r23c1` 四个单元格的其中两个单元格会填入一样的数字。

你还是没明白？那就按之前欠一数组的方式来进行字母的假设吧。假设 `r1c1` 填 $$a$$，那么 `r1c23` 的其中一个就得填 $$b$$，与此同时 `r23c1` 其中一个也得填 $$b$$。其中 $$a$$ 和 $$b$$ 是 1 或 3，且 $$a \ne b$$。但是，因为四个单元格整体都在 `b1` 之中，所以又不被允许填入相同的数字。但这四个单元格会同时填俩 $$b$$ 进去，所以矛盾了。

所以，对于数字 2 而言，是不能填两次的。而 1 和 3 完全同理，所以无需重复证明。于是我们知道了，数字 1、2、3 一定在三个单元格里只能各自填一个。

有人问，能不能存在某个数不填的情况。那肯定是不能的。因为有一个数不填，那势必就会有一个数填两次，才能让三个单元格都填上数；而某个数填两次会矛盾的点已经被证明了，所以显然是不行的。

## 结论 <a href="#conclusion" id="conclusion"></a>

当我们得到跨区数组时，这个技巧的内容就结束了。虽然我们有两大特性可以得到，但实际上这个技巧的主要结论使用，主要还是利用这个技巧是跨区数组的特性。

这个技巧利用的是一个整行和整列两个区域，并交于同一个单元格；另外，利用这个单元格的所在宫，我们还可以得到一些特殊结论和矛盾。我们把这个结构称为**烟花**（Firework）或**烟花数组**（Firework Subset），指的是图中构成跨区数组的 `r1c19` 和 `r9c1` 这三个单元格。

可以看出，烟花技巧的本质在于使用三个单元格，所以烟花数组的规格默认都是 3。后续我们会介绍一些特殊例子，他们不一定是三个单元格构成，但也都是从三个单元格派生出来的用法，本质也离不开三数组的这种模式。

下一节我们将继续针对结构展开说明它的一些用法。


# 烟花数组的各种用法

Usages on Firework Subset

前面我们理解了烟花数组的基本推理后，我们来看实际的例子。

## 烟花三数组（Firework Triple） <a href="#firework-triple" id="firework-triple"></a>

<figure><img src="/files/CG6VVC2x0d45KDk8rATK" alt="" width="375"><figcaption><p>烟花三数组</p></figcaption></figure>

如图所示。本题的构造几乎就是照着之前的结构构造出来的。在题目刚开始还没填一个数就可以来到这里。

首先，观察 `r1c19` 和 `r9c9` 三个单元格。这一次用的是 `r1` 和 `c9` 两个区域；然后数字 1、2、3 在 `b2` 和 `b8` 里都有提示数的制约，所以显然 `r1c456` 以及 `r456c9` 都填不了 1、2、3。虽然这一点和之前结构长得不太一样，但这里不让填的条件也是照样满足的。

然后，我们试着再次使用之前的烟花数组的逻辑去证明它是否是跨区数组，可以发现它仍然成立。先是可以得到这三个单元格不能填 1、2、3 以外的其他候选数。这是很容易可以得到的。不过，上一节我们没有讨论 `r1c9` 这个交叉点的情况（之前那个结构示意图里交叉点的单元格是 `r1c1`，当时它是只有 1、2、3 三种候选数而没有别的候选数的）。那么我们这里主要针对于这个单元格证明一下。实际上也不难。

如果我们允许 `r1c9` 填入不是 1、2、3 的一个数进去，那么我们可以得到的是，`r1c178` 是数字 1、2、3 唯三可以填在 `r1` 的位置。同理，`r239c9` 也是数字 1、2、3 唯三可以填在 `c9` 里的位置。显然，`r1c1` 和 `r9c9` 会填写进去一个 1、2、3 的数字，不管它是多少吧，这都不重要，因为他们不会造成矛盾。主要矛盾点还是在 `r1c78` 和 `r23c9` 这四个单元格。这四个单元格要填 1、2、3 三种数字的其中任意的数，而这四个单元格同处于一个宫里，所以无论如何肯定都会至少有一个数填两次，这就直接矛盾了。所以“`r1c9` 不能是 1、2、3 以外的填数”就说清楚了。

刚才我们是知道了这三个单元格只能填入 1、2、3 里的数，下面接着是需要证明他们是跨区数组。证明跨区数组的部分这里就省略了，不过可以简单提醒一下，证明的方式是假设其中 `r1c1` 和 `r9c9` 填入重复的数字，只要证明这两个重复的数字会造成题目出现矛盾就行。

总之，我们能够得到跨区数组的结论。那么这个题的结论就变得非常显而易见了。只不过这里要额外说明的是，图中还额外标注了删数 `r2c7 <> 2` 和 `r3c8 <> 1` 的结论。这两个删数是怎么来的呢？因为跨区三数组。因为 `r1c19` 和 `r9c9` 是跨区数组，而且 `r1` 和 `c9` 可以填入 1、2、3 的位置也非常有限，所以我们不妨再次使用之前欠一数组假设为字母的逻辑来看这个技巧，我们就可以得到这样的字母填充情况：

<figure><img src="/files/hbZBtTkMLOrvRFgrQ6HH" alt="" width="375"><figcaption><p>烟花三数组，字母假设视角</p></figcaption></figure>

如图所示。假设我们让 `r1c1` 填 $$a$$、`r1c9` 填 $$c$$、`r9c9` 填 $$b$$ 的话（其中 $$abc$$ 是数字 1、2、3 且互相都不相等），那么 `r1c78` 也能填 1、2、3 的位置就会选取其中一个单元格填 $$b$$（因为 `r1` 能填 $$b$$ 的位置也就它俩了，而 $$a$$ 和 $$c$$ 都被填了）；同理，`c9` 里只有 `r23c9` 可以填 $$a$$ 了，所以它俩有一个是 $$a$$。

当我们得到这一点后，我们可以发现这里还会有一个额外的三数组的出现。其中 `r23c9` 取一个单元格填 $$a$$，`r1c78` 取一个单元格填 $$b$$，配合原有的假设 `r1c9` 填 $$c$$，这样就是一个三数组。

既然这里也有一个数组，所以结论自然就是，这一宫里其他单元格都不能是 1、2、3。对于这个题自然就是 `r23c78 <> 123` 了。当然，这里剩余的候选数不多了，所以实际上就能删俩（图中那俩）。

我们把这个就称为**烟花三数组**（Firework Triple），属于是最基础的烟花数组的使用方式。下面我们再来看一个例子，不过这个例子就不像图中删那么多了。

<figure><img src="/files/qceEPJQucPJ5xAdqtdNA" alt=""><figcaption><p>另一个烟花三数组的例子</p></figcaption></figure>

如图所示。这个例子就自己理解了。不过这里同时给你两个视角，一个是原来的数组的视角，一个是假设了字母的视角，可以帮助你推理和理解它的假设过程。

## 烟花数对（Firework Pair） <a href="#firework-pair" id="firework-pair"></a>

说完了标准版本，下面我们来看一个怪东西。

<figure><img src="/files/u5kyYbEfmc8f8CgNqTD1" alt="" width="375"><figcaption><p>烟花数对</p></figcaption></figure>

如图所示。这个题看似是烟花数组，但实际上压根就没用到三种数字，它甚至会少一个数字的使用，所以之前的推理过程可能需要重新审视一下了。

倒也不是完全重新推翻再来推理一遍，至少很容易可以看出数字 1 和 9 满足之前烟花数组的那种数字的摆放逻辑。只是之前是 1、2、3 三种数字都满足烟花数组的那个摆放占位逻辑，这次就只有 1 和 9 而已；然后，因为它不同于之前的推理，所以我们还需要额外补充外援。这个题额外用到了 `r1c5` 和 `r5c9` 两个单元格。这两个单元格比较特殊，他们都恰好只有候选数 1 和 9，这会帮我们大忙。

我们来看一下这个的推理过程。首先，因为 `r1c5` 和 `r5c9` 均只可以填入 1 和 9 两种数字，所以这两个单元格的可能填入的数字组合只有两种：

* 它俩填一样的数（都是 1 或者都是 9）；
* 它俩填不一样的数（1 和 9 各一个）。

之所以没有让各位读者继续深究它内部填 1 和 9 的四种排列情况，是因为这反而没有必要。

### 情况 1：r1c5 和 r5c9 填相同数字 <a href="#case-1-of-firework-pair" id="case-1-of-firework-pair"></a>

先来看第一种情况。假设 `r1c5` 和 `r5c9` 填入相同的数字（比如假设都填 $$a$$），则请关注 `c1` 和 `r9` 这两个区域。我们发现，数字 $$a$$ 此时因为假设的关系显然不能填在 `r1c1` 和 `r9c9` 上。但是，我们为了确保数字 $$a$$ 又必须同时在 `r9` 和 `c1` 里都出现，此时 $$a$$ 能在 `c1` 里填的位置就只剩下 `r789c1` 了，而 `r9` 里剩下的只有 `r9c123` 了，而总体这五个单元格都恰好位于同一个宫 `b7`，这个“位于同一个宫”和之前烟花数组的逻辑比较相似。

既然同一个宫，那么就说明这个数就不能填两次；而我们又强制需要 `r9` 和 `c1` 又都得填上 $$a$$，这就说明只有让 `r9c1` 填 $$a$$ 才能同时满足既两个区域都能有 $$a$$ 又不会引发重复填数的矛盾，所以此时就有 `r9c1` 填 $$a$$ 的结果。

接着，既然 $$a$$ 确定了位置，那么 $$b$$ 的位置呢？此时我们要保证的是，`r9` 和 `c1` 都需要有 $$b$$ 的出现，但此时 $$b$$ 能够确定的位置有哪里呢？刚才假设用过的 `r78c1` 和 `r9c23` 这四个单元格，外带 `r1c1` 和 `r9c9` 这两个单元格，一共六个单元格。这六个单元格是可以填 $$b$$ 的、这两个区域里全部可能的位置了。

这六个单元格要放两个 $$b$$，又要规避填数时造成显然违背数独规则的重复填数的情况，那么我们不妨把这六个单元格进行下面四个部分的拆分，然后两两排列起来看看是否存在矛盾：

* `r1c1` 这一个单元格；
* `r9c9` 这一个单元格；
* `r78c1` 这两个单元格的其中一个单元格；
* `r9c23` 这两个单元格的其中一个单元格。

拆分成这四部分的意思是，最终数字 $$b$$ 因为要填入两个，所以最终会落入到其中的两个部分里去。在众多的假设中，我们会发现这么一个现象。先不论对不对，只要 `r1c1` 填 $$b$$，而最初因为 `r1c5` 被假设为 $$a$$，所以此时 `r1` 上会有固定的两个单元格 `r1c15` 构成关于 1 和 9 的数对结构（因为 $$a$$ 和 $$b$$ 就是 1 和 9）；同理，如果让 `r9c9` 填 $$b$$，则 `c9` 上也会出现固定的两个单元格 `r59c9` 形成 1 和 9 的数对。

我们渐渐地往这个方向上去看，会发现一个非常巧合的点。最终不论你怎么假设，`r1c1` 和 `r9c9` 肯定会有至少一个单元格填 $$b$$。因为能不让他们都不填 $$b$$ 的情况只有一种：`r78c1` 和 `r9c23` 这两部分同时填 $$b$$。但是很显然这并不成立，因为这四个单元格同在 `b7` 之中，显然是不能重复填的，所以就直接矛盾了。

所以，我们比较巧合地得到了 `r1c15` 或者 `r59c9` 肯定会有一个是关于 1 和 9 的数对结构。

### 情况 2：r1c5 和 r5c9 填不同数字 <a href="#case-2-of-firework-pair" id="case-2-of-firework-pair"></a>

第二点一旦填上去就会发现问题。既然我们假设成不同数字了，而这两个单元格又恰好只能是 1 和 9，所以此时 `r1c5` 和 `r5c9` 直接形成关于 1 和 9 的跨区数对结构。

### 总结 <a href="#conclusion-to-firework-pair" id="conclusion-to-firework-pair"></a>

两种情况均可导向数对结构的结论，只不过最终产生的数对结构一共有三种：

1. `r1c15` 是数对；
2. `r59c9` 是数对；
3. `r1c5` 和 `r5c9` 是跨区数对。

他们最终都会影响到 `r1c9` 这个单元格。所以这个题的结论就是 `r1c9 <> 9`。1 也可以删，只是这个题没有候选数 1 的结论罢了。

我们把这个结构称为**烟花数对**（Firework Pair）。逻辑上真是一层套一层的，真要从零开始假设起来确实有些恶心，不过从大体上可以看出是借助了之前烟花数组的推理思路。

### 不太重要但有伏笔的结论 <a href="#extra-conclusion" id="extra-conclusion"></a>

在前面的例子里，我们主要尝试的是假设 `r1c5` 和 `r5c9` 两个单元格的填数是否相同来决定最终的结论的。不过，如果我们只单独去看 `r19c1` 和 `r9c9` 三个单元格的话，实际上也是有个结论的，也就是 `r1c1` 和 `r9c9` 是不能同时既不是 1 也不是 9 的。原因其实很好知道：一旦他俩既不是 1 也不是 9 之后，对于 `c1` 和 `r9` 而言，1 和 9 的填数位置就会全部被挤入到 `b7` 之中，因为要保证同时 `c1` 和 `r9` 均要填入 1 和 9，所以就无论如何都放不下这两个数了，所以就引发了矛盾。

这个结论其实并不算特别高级，实际上看起来也没多大用，但请记住它，它为稍后的四数组的推理埋下了伏笔。

## 烟花四数组（Firework Quadruple） <a href="#firework-quadruple" id="firework-quadruple"></a>

下面我们来看四数组的版本。所谓**烟花四数组**（Firework Quadruple），它其实是两个烟花数对叠加在一起的用法。

<figure><img src="/files/g0ew8MMesPMniMG58CEQ" alt="" width="375"><figcaption><p>烟花四数组</p></figcaption></figure>

如图所示。可能你看到这个结构似乎有一点头绪，但又不是很多。

### 结论 1：r4c1 和 r9c6 只能是 1、2、3、4 <a href="#conclusion-1-of-firework-quadruple" id="conclusion-1-of-firework-quadruple"></a>

我们先来看数字 1、2 的填数情况。

<figure><img src="/files/1W6bDvMIM1YZLRGI2Fd8" alt="" width="375"><figcaption><p>1 和 2 的情况</p></figcaption></figure>

如图所示。很明显的是，`c1` 和 `r9` 里可填 1 和 2 的只有 7 个单元格：`r4789c1` 和 `r9c236`。

看起来无法继续了。这里我们要借用一下前面的伏笔结论。因为 1 和 2 只能放在这 7 个单元格之中，所以为了确保 1 和 2 都能够放下到 `c1` 和 `r9` 之中，`r4c1` 和 `r9c6` 至少有一个单元格要填 1 或者 2 的其中一个数。我们先记住它。然后来看 3 和 4。

<figure><img src="/files/fIdxSwa5z3ty43TVxgr7" alt="" width="375"><figcaption><p>3 和 4 的情况</p></figcaption></figure>

如图所示。很显然数字 3 和 4 也具备类似的结论：`r4c1` 和 `r9c6` 里必须至少有一个单元格是 3 或 4 的其中一个数。

欸不对等会儿。这都不能说恰好了，未免也有点太巧了。两个结论都用的是完全一样的两个单元格 `r4c1` 和 `r9c6`，唯一不同的是用的区域是不同的，一个是 `c1` 和 `r9`，一个则是 `r4` 和 `c6`。

因为我们知道，`r4c1` 和 `r9c6` 既要满足至少一个 1 或 2，又要满足至少一个 3 或 4，那么干脆我们就让它俩一个填 1 或 2，一个填 3 或 4，两个单元格就直接用完了。这便得到了 `r4c1 <> 5` 和 `r9c6 <> 9` 的初始结论，因为填了 1、2、3、4 就没机会填其他数字了嘛。

### 结论 2：r49c16 是跨区四数组 <a href="#conclusion-2-of-firework-quadruple" id="conclusion-2-of-firework-quadruple"></a>

接着我们还可以得到一个结论。由于我们让 `r4c1` 和 `r9c6` 填上了两个数字，那么此时我们不妨假设成字母表示起来会方便一些。假设 `r4c1` 填 $$a$$，`r9c6` 填 $$c$$，其中 $$a$$ 是 1 或 2 的其一，$$c$$ 是 3 或 4 的其一。那么，为了确保数字 $$b$$（1 或 2 里另外一个不是 $$a$$ 的数）能够填到 `c1` 和 `r9` 里，但由于可填的位置只剩下 `r789c1` 和 `r9c23` 这五个单元格了，要保证 $$b$$ 又得同时在两个区域里出现，那么我们只能安排 $$b$$ 填在 `r9c1` 上才满足题意了，这是唯一的机会。所以我们就有 `r9c1` 填 $$b$$ 的结果。

同理，我们再次观察 `r4` 和 `c6`。为了确保数字 $$d$$（3 或 4 里另外一个不是 $$c$$ 的数）能够填到这两个区域里去，此时因为只有 `r4c456` 和 `r56c6` 这五个单元格可以填，所以要保证两个区域都有这个数，我们只能安排它填在 `r4c6` 上了。所以，`r4c6` 填 $$d$$。

好了，现在我们列举一下前面的假设。其中：

* `r4c1` 填 $$a$$；
* `r4c6` 填 $$d$$；
* `r9c1` 填 $$b$$；
* `r9c6` 填 $$c$$。

欸，四个数都不一样。是的，这样我们就得到了一个新鲜的结论：`r49c16` 构成跨区四数组结构，关于数字 1、2、3、4，而且根据字母假设的情况，`r4c6` 只能是 3 或 4，`r9c1` 只能是 1 或 2。所以图中可以看出，删数还多出来了 `r4c6 <> 189, r9c1 <> 3456` 这一些。

不过这里要尤其注意一个比较容易忘掉的地方。我们只是知道了 `r4c1` 和 `r9c6` 必须有一个填 1 或 2，有一个填 3 或 4，但并未提及具体哪一个是什么数。前面给的这个假设模式其实只是它的其中一个情况。它的另外一个情况则是让 `r4c1` 填 $$c$$，而 `r9c6` 则填 $$a$$。此时四个单元格的填数是这样的：

* `r4c1` 填 $$c$$；
* `r4c6` 填 $$d$$；
* `r9c1` 填 $$b$$；
* `r9c6` 填 $$a$$。

也就是说，另外的这一种填数模式仍然会构成跨区四数组。

### 结论 3：b7 有 1 和 2 的数对，b5 有 3 和 4 的数对 <a href="#conclusion-3-of-firework-quadruple" id="conclusion-3-of-firework-quadruple"></a>

我们接着深入讨论一下。由于我们刚才第一种假设了 `r4c1` 和 `r9c6` 的填数分别是 $$a$$ 和 $$c$$，而让 `r9c1` 填了 $$b$$，所以，数字 $$a$$ 只是在 `c1` 里有了归属，`r9` 我们却并未提及。不过也很好说。`r9` 此时只剩下 `r9c23` 可以填 $$a$$ 了，所以这两个单元格里肯定有一个 $$a$$。

同理，我们还可以得到 $$c$$ 在 `r4c45` 里必须填一个的结论，思路也是完全一样的。

所以！所以我们就有了新结论：`r9c23` 里拿出一个单元格，配合 `r9c1` 会构成一个关于 1 和 2 的数对结构，而 `r4c45` 里其中一个单元格会配合 `r4c6` 构成关于 3 和 4 的数对结构，于是 `b5` 和 `b7` 里因为分别存在这样的数对，所以图中还剩下的删数 `r6c4 <> 4, r7c3 <> 1` 就是这么来的。

另外，其实第二种假设仍然具有这样的结论，不过我这里就不带着再假设一次了。

总之，两种均可得到数对的结论，因此额外的删数是成立的。只不过这里要注意的是，因为位置的不同，虽然我们能知道 `b57` 均有数对的存在，但实际上最终他们位置关系和摆放其实稍微有一点不同，所以删数的范围在 `b57` 里只有 `r56c45` 这四个单元格，以及 `r78c23` 这四个单元格。侧边上诸如 `r56c6` 和 `r78c1` 这些位置都是不能参与删数的，因为他们最终可能有一个情况会用到这些格子。

### 总结 <a href="#conclusion-to-firework-quadruple" id="conclusion-to-firework-quadruple"></a>

我相信你肯定看累了前面的文字。这里再给各位列一下前面字母假设的排列情况，方便各位对照两种模式的最终效果。

<figure><img src="/files/sAKuYcOPvuwvGG2OFztj" alt=""><figcaption><p>两种最终填数情况（字母假设版）</p></figcaption></figure>

如图所示。这是最终两种假设的情况。要说清楚的是，尤其 `b5` 和 `b7` 的填数情况分布，数字 $$a$$ 和 $$b$$ 这一对和 $$c$$ 和 $$d$$ 这一对在两种填数模式下，甚至连最终填数位置都有所不同，所以我们只能知道有数对的形成，但最终其实并不能保证 $$a$$ 和 $$c$$ 具体的位置。因此，数对的删数范围是前文所说的 `r56c45` 以及 `r89c23` 这个范围。

至此，我们就把烟花数组的内容全部介绍完了。另外，基础候选数技巧的内容也在这里结束。下一篇内容将会在新的板块里展开。


# 双强链

Two-Strong-Link Chain

欢迎各位来到新板块。这个板块就纯粹是帮助各位研究和解决难题而量身定制的了。这个板块的内容在平时做题时几乎都遇不到，因为它的概念理解较为晦涩，其次也不常见于题目之中。

当然，刚开始的内容其实也都还能接受；到后面就会越来越难了。

## 摩天楼（Skyscraper） <a href="#skyscraper" id="skyscraper"></a>

先让我们从最基础的学起。

<figure><img src="/files/YZiT7Q92p278q4lhMJ5u" alt="" width="375"><figcaption><p>摩天楼</p></figcaption></figure>

如图所示。这个图看着是不是有点像之前学过的孪生退化二阶鱼？是的，这从结构上来看确实是完全一样的。不过这次我们教各位看的是另外一个视角，而不是从鱼的角度来理解它。

我们注意，`r39` 两行均有关于 4 的共轭对，这意味着这两行只能填两个 4，且整体必须填到 `r3c48` 和 `r9c47` 四个单元格之中。

我们不妨让 `r3c8(4)` 成为我们此次推理的开端。假设 `r3c8(4)` 的填数情况一共就只有两种：`r3c8 = 4` 和 `r3c8 <> 4`。我们都来看看。

* 如果 `r3c8 = 4`，则好像没啥可延续的推理过程，我们先放一边；
* 如果 `r3c8 <> 4`，则由于 `r3` 存在共轭对，所以 4 此时只能填 `r3c4` 上。于是有 `r9c4 <> 4`，然后由于 `r9` 又恰好有共轭对，所以 `r9c7 = 4`。

对于 `r3c8 = 4` 我们还没有看到令人惊艳的地方；但是对于 `r3c8 <> 4` 而言，我们发现两个共轭对居然因为假设 `r3c8 <> 4` 而形成了完整的思路链条，从 `r3c8 <> 4` 一路推到 `r9c4 = 4`。

这还不是推理的终点。因为我们必须要找出结论，而这个推理过程我们明显发现到一个问题是，因为初始假设的两种情况是互斥的，而且它俩也恰好是 `r3c8` 的所有可能的情况。要注意 `r3c8 <> 4` 意味着 `r3c8` 可以填入除了 4 以外的任意一个数，所以对于这个题里 6 和 9 都是可能填入的。但是我们在假设时并没有关心它最终填了几，而是整体算作了一个情况。不管是 6 还是 9，“不等于 4”就可以使得逻辑可以直接顺推下去，那么我们就不需要关心它具体是几。

总之就是，“等于 4”和“不等于 4”两者联立起来，那就是所有的情况。而最终，我们要么得到 `r3c8` 填 4，要么 `r9c7` 填 4。这样想下去，对于例子里 `r1c7` 和 `r7c8` 而言，这两个单元格不论如何都是填不了 4 的。这一点和之前 XY-Wing、W-Wing 等技巧的最终删数确定的逻辑是完全一样的，我们这里再用一遍：如果 `r1c7` 填了 4，会同时造成 `r3c8` 和 `r9c7` 都填不了 4。我们刚刚才得到这两个单元格必须有 4 的填入，所以它直接就引发矛盾了。

所以，这个题的结论就是 `{r1c7, r7c8} <> 4`。

我们把这个推理过程（借用四个相同数字、两个共轭对，初始假设一个单元格的某个候选数是正确填数和错误填数两种情况进行推理，联立并得到结果的推理过程）称为**双强链**（Two-Strong-Link Chain）。双强链按照两个共轭对摆放的方式又可以细分为三种，这是第一种情况，叫**摩天楼**（Skyscraper），共轭对摆放是“平行”的：两个共轭对同时都是行上或者列上的。因为两个共轭对的摆放是平行的，所以我们可以把它俩“竖起来”，看起来就像是两座大厦一高一矮耸立在地面上，所以才取了“摩天楼”这个名字。

## 链理论的引入 <a href="#brief-introduction-to-chain-theory" id="brief-introduction-to-chain-theory"></a>

### 链的术语 <a href="#terms-of-chain" id="terms-of-chain"></a>

为了衔接后续的内容，我们不得不从这里开始介绍链的理论。

仔细观察刚才的题目，两个共轭对之间夹了一个 `c4`，它只需要满足数字 4 不重复填到 `c4` 上即可。对于 `r3c8 <> 4` 这个情况而言，我们顺次推理的逻辑列举起来是这样的：

```
r3c8 <> 4 -> r3c4 = 4 -> r9c4 <> 4 -> r9c7 = 4
```

我们把这个思路链条称为一条**链**（Chain）。其中，链的开端是 `r3c8 <> 4`，结尾是 `r9c7 = 4`。我们把 `r3c8 <> 4` 称为**链头**（Head），而 `r9c7 = 4` 称为**链尾**（Tail）。每一个假设的单位是一个个“填 4”和“不填 4”的结论，我们把这些单位称为一个链的**节点**（Node），并把假设填入的节点称为**真**（True），把不填入的节点称为**假**（False）。

在链理论里，共轭对这种必须往两头填一个进去（用术语来说就是，两端必有一个候选数为真）的情况称为两个节点有**强链关系**（Strong Inference），简称**强关系**，而对于 `c4` 这种，从 `r3c4 = 4` 得到 `r9c4 <> 4` 这种用于辅助的逻辑称为两个节点有**弱链关系**（Weak Inference），简称**弱关系**。可以从这个说法里看出，因为 `r3c8 <> 4` 到 `r9c7 = 4` 一共就用了两个强关系，所以这个结构才叫双强链，即有两个强关系的链。

最后，我们把链头和链尾影响并能造成删数的位置称为**交集**（Intersection）。

> 从英文名可以看出，inference 其实是推断的意思，而不是关系的意思。关系和推断形式上最接近的单词是 reference，所以单词并不一样。这其实是翻译失误。但是，后来因为它确实比起“推断”一词来说更容易理解，所以就将错就错沿用下来了。

### 链的文本表述 <a href="#text-notation-of-chain" id="text-notation-of-chain"></a>

想要用文本形式描述上面的整条链，我们需要使用两个额外的符号：强链记号和弱链记号。

强链记号用 `==` 或 `=` 表示，弱链记号则用 `--` 或 `-` 表示。例如前面列举的四个节点，我们整合成链的写法的话，是这样的：

```
r3c8(4) == r3c4(4) -- r9c4(4) == r9c7(4) => {r1c7, r7c8} <> 4
```

其中，我们将节点的真假性弱化，直接改成候选数的表示形式；然后借用强弱链的记号直接连接每一个节点即可。最后使用推出符号 `=>` 表示结论导出的过程，整个链就写完了。

### 链的箭头画法

可以看出，前面的配图使用的是一些涂色块来描述其中的共轭对，也就是强链关系的部分，以及弱链关系的部分。不过，这个画法并不常用。在规范的画图里，我们一般会使用箭头来描述一个强弱关系。其中，实线箭头表示强链关系，虚线箭头则表示弱链关系；然后使用两种不同的配色来区分节点推导过程之中的真假性。

例如上面的例子，我们的规范画法应该是这样的：

<figure><img src="/files/2qLRC9JB0Av5oOcfaUM9" alt="" width="375"><figcaption><p>链的规范画法</p></figcaption></figure>

如图所示。比如这个画法我们把橘色节点表示为假，绿色节点表示为真；然后使用实线箭头表示强关系，虚线箭头表示弱关系，箭头方向则表示的是推理序列。当然，配色不一定和图上一样，例如一款叫 HoDoKu 的软件，假设为假的节点则用的是蓝色而不是橘色来表示的：

<figure><img src="/files/xY4G1ePUvuQFEyIuDMRR" alt="" width="375"><figcaption><p>HoDoKu 软件的配色方案</p></figcaption></figure>

为了不给各位增添学习负担，链理论需要提前先学习到的部分就到这里就结束。下面我们继续后面的内容。

## 链理论的进一步剖析 <a href="#further-steps-to-chain-theory" id="further-steps-to-chain-theory"></a>

刚才我们已经初步了解了链的基本内容。下面我们来看看链的一些细节上需要注意的地方，以及更接近于原理的内容。

### 链关系的交替性 <a href="#alternating-inferences" id="alternating-inferences"></a>

从前面的内容里可以看出，链的强弱关系因为节点的真假性是需要交替出现的。链理论规定了一点：**节点必须以为假开头，进行交替推理，并以节点为真结束**。对比前面的例子，例子里的用法是满足这个说法的。

那么，我们再来重新审视一下链的强弱关系。因为节点必须以假开头，那么前面的例子用到了两个强关系和一个弱关系，一共四个候选数（四个节点），那么他们的真假性呈现为“假 -> 真 -> 假 -> 真”的过程。因为链需要以节点为真结束，所以这期间必须由偶数个节点构成（因为链头是假）。所以，我们就有这样的一个结论：

**链的长度（Length）被定义为链的强弱关系的使用总次数，所以链的长度总是一个奇数；而因为节点数一定比链的长度大一个单位，所以链的节点数总是一个偶数。**

这是第一个可以得到的结论。比如之前的例子里，链的长度为 3，节点数为 4。

我们继续。因为链头在规定上是必须为假的，所以第一个链关系必定是强关系（从不填得到填就必须要有一个共轭对的依托才行），然后弱关系，这么交替着来。而又因为最终是得到链尾为真，所以它的前一个节点也是为假的，所以也是一个强关系。因此我们还有一个结论：

**链的头尾必须都是强关系。**

这便是第二个可以得到的结论。

最后，我们还能通过前面的描述规范化定义出强弱关系：

* **强关系：当一个节点为假时可得到另一个节点为真，就称为两个节点有强关系；**
* **弱关系：当一个节点为真时可得到另一个节点为假，就称为两个节点有弱关系。**

这便是规范化之后的定义方式。

不过这里要多啰嗦一句。在例子里 `c4` 里的两处 4，客观来说其实也是共轭对。虽然按照定义来看，它也符合强关系的定义，但实际上我们在推理时候并未使用共轭对的特性，所以可以看出，强弱关系的定义只是形式上对称的定义，而对称的定义并不意味着两个定义没有交集。比如说这里的 `r39c4(4)` 从定义上就客观同时满足强关系和弱关系的定义，只不过我们用的是弱关系，毕竟链需要强弱交替。但是，如果你在网上看到诸如“‘强-强-强’的链也是成立的”这种说法，那它就是错误的说法，因为它违背了链交替推导的本质逻辑。

总之，链因为需要交替的推理过程，所以链还有一种叫法，叫**交替推理链**（Alternating Inference Chain，简称 AIC）。不过这里我们就不用了，就叫链就行。

### 链头尾的可同真性 <a href="#strong-inferences-between-head-and-tail" id="strong-inferences-between-head-and-tail"></a>

前面的内容我们都只是单纯只对其中有思路链条的那一个情况进行了说明和理论知识的补充，但在完整的推理过程时，我们是假设了某一个候选数为真和假两种情况的。只是有一种情况（假设为真）似乎看不出可以进行下一步的行为，因此我们直接让它“夭折”在了初始的状态下。

但是，因为要联立两种情况，我们才能得到最终的结论。而结论的形成，依赖的是链头和链尾有一个为真这么一个说法。那么，你有没有想过这么一个问题：链头和链尾是否可以同时为真？

这个问题看起来似乎没有什么营养。不过你自己思考一下，其实可以发现异样。

按道理来说，假设某个候选数 $$A$$ 为假，则顺次推理 $$B$$、$$C$$、$$D$$，并最终得到 $$D$$ 为真；然后还含有另一个夭折了的情况：假设 $$A$$ 为真。在两种情况联立后，我们可以得到 $$A$$ 为真或者 $$D$$ 为真的结论。按道理说，初始假设的 $$A$$ 为假和为真其实是两种互斥的状态，所以 $$A$$ 为真或 $$D$$ 为真这个推理才产生的效果应该也是互斥的才对。如果 $$A$$ 和 $$D$$ 从答案上体现出来他们同时都为真，这算哪门子情况？

很遗憾的是，链头和链尾确实是可以同时为真的。那么我们刚才的说法哪里有问题呢？错误出在“所以 $$A$$ 为真或 $$D$$ 为真这个推理才产生的效果应该也是互斥的才对”这个说法。为什么呢？因为 $$D$$ 的真假性并不一定非得要 $$A$$ 来决定，它可以由其他位置来决定；可能 $$D$$ 客观而言（比如说答案上）它确实是为真的，但这不代表它为真是一定是由 $$A$$ 来决定的。我举一个例子你就明白了。你感冒了就会流鼻涕，但这不代表你流鼻涕就一定是由你感冒引起的。万一你有鼻炎呢？

正所谓相关性不代表因果性。两个事件具有顺推的影响，但这不代表结果的形成一定由初始的条件引起。这是最为通俗的解释。而从数学的角度来说，由 $$A$$ 到 $$D$$ 和由 $$D$$ 到 $$A$$ 是互为逆命题的，而互为逆命题的两个命题逻辑上没有直接关联（等价性等等），所以不能混为一谈。对于命题与逻辑，我们将在之后进行详细说明，这里就不展开了。

我们现在来看看一个反例，即链的头尾确实同为真的情况。

<figure><img src="/files/q2cyIxXs4Q6PYWYB66xR" alt=""><figcaption><p>同为真的反例</p></figcaption></figure>

如图所示。这个链的头尾分别是 `r5c6(2)` 和 `r9c4(2)`。但是很明显看到答案里，这两个单元格就是都填的 2。

## 双线风筝（Two-String Kite） <a href="#two-string-kite" id="two-string-kite"></a>

在我们将原理进一步剖析后，我们回过头来看链，是不是会觉得更加有趣了点呢？

<figure><img src="/files/QQJ7YYulBxlUFIBzBLSr" alt="" width="375"><figcaption><p>双线风筝</p></figcaption></figure>

如图所示。链的表示如下：

```
r1c9(8) == r1c5(8) -- r3c4(8) == r7c4(8) => r7c9 <> 8
```

同样地，我们也是按照假设 `r1c9(8)` 的两种情况得到最终删数。

只不过，这次因为强链关系是垂直摆放的（一个行一个列），所以我们把这种情况的双强链称为双线风筝。你把 `r7c9(8)` 和链头以及链尾连起来，你就会发现它非常像是一个风筝，拉了两条线上去。

## 多宝鱼（Turbot Fish） <a href="#turbot-fish" id="turbot-fish"></a>

既然强链关系平行的介绍过了，垂直的也介绍过了，那是不是存在既不平行也不垂直的情况呢？答案肯定是有的。只要其中一个强链放在宫里，那么它连接的时候就是斜着的，这样就既不平行也不垂直了。

<figure><img src="/files/3CUYN9EtpvxICPb8stsH" alt="" width="375"><figcaption><p>多宝鱼</p></figcaption></figure>

如图所示。链的表示如下：

```
r2c7(7) == r1c9(7) -- r5c9(7) == r5c2(7) => r2c2 <> 7
```

这个链也不需要过多解释。就自己看了。

我们把这种强链关系既不平行也不垂直的情况称为**多宝鱼**（Turbot Fish），跟双线风筝一样，也是跟形状有关。

至此我们就把双强链的内容说完了。

## 形象记忆 <a href="#abstract-figures" id="abstract-figures"></a>

如果你记不住前面三种技巧的对应名称，这里可以给各位列一下它们抽象出来的结构画法，便于记住他们。

<figure><img src="/files/8f7TC09awhXlmJWyoswH" alt=""><figcaption><p>三种图像的抽象</p></figcaption></figure>

其中红色线条是实际结构，双实线是强链关系，单实线是弱链关系，圆圈表示节点，叉号表示删数。黄色的内容是补充的部分，便于记住他们，没有任何实际的意义。


# 同数链和异数链

X-Chain & Multidigit Chain

接下来我们针对前面学到的链的逻辑继续进行后面的知识点的学习。


# 同数链和异数链的定义

Definition of X-Chain & Multidigit Chain

之前我们学习了链的一些基础的定义和推理逻辑，这里我们再次回顾一下。

1. **链的开头和结尾都必须是强链关系；**
2. **链头应固定为假，并得到链尾为真；**
3. **链节点的真假性应交替出现，而对于强弱关系而言，则也是交替的；**
4. **链的长度一定是一个奇数，而链的节点数则一定是一个偶数；**
5. **链的头尾至少有一个为真。**

然后回顾一下强弱关系的定义：

* **强链关系：如果一个节点设为假可得到另一个节点为真时，则我们认为他俩有强链关系；**
* **弱链关系：如果一个节点设为真可得到另一个节点为假时，则我们认为他俩有弱链关系。**

下面我们带着这些内容，继续看后面的知识点。

## 同数链（X-Chain） <a href="#x-chain" id="x-chain"></a>

<figure><img src="/files/9Y1pVj1GfOobyIj4J8Le" alt="" width="375"><figcaption><p>同数链</p></figcaption></figure>

如图所示。这也是一条链，不过它比之前我们学到的双强链多了一个强链。它的长度达到了 5。不过推理还是挺容易的。

首先针对于候选数 `r4c2(3)` 讨论两种真假性情况：

* 如果 `r4c2 = 3`，则暂时无需考虑后续逻辑；
* 如果 `r4c2 <> 3`，则可根据 `r4`、`b9` 和 `c5` 三个共轭对，并最终真假交替得到 `r6c5 = 3` 的结论。

两种情况下至少有一个成立，所以 `r4c2` 和 `r6c5` 将有至少一个单元格填的是 3。所以，`r6c123 <> 3` 是这个题的结论（他们三个之中有一个是 3 就会破坏掉我们刚刚得到的结论）。

还是和之前一样，写一下链的文本表达：

```
r4c2(3) == r4c8(3) -- r8c8(3) == r7c9(3) -- r7c5(3) == r6c5(3) => r6c123 <> 3
```

可以看到，前面介绍的这个链所有的节点均用的是同一个数字（这不废话么）。我们把这种链称为**同数链**、**单数链**或**单链**（X-Chain），表示所有的节点均指向同一种数字；英文名 X-Chain 的 X 在这里表示的是未知数 $$x$$。比如说这里你可以认为 $$x = 3$$。

我们再来看一个例子。

<figure><img src="/files/DBKhoU5LTans0AG4gE5k" alt="" width="375"><figcaption><p>同数链，另一个例子</p></figcaption></figure>

如图所示。这个链表示如下：

```
r1c2(7) == r1c9(7) -- r2c8(7) == r7c8(7) -- r7c3(7) == r4c3(7) => r4c2 <> 7
```

因为推理完全一样，所以就不重复说明了，这里就自己理解了。

## 异数强弱关系的引入 <a href="#introduction-to-inferences-between-different-digits" id="introduction-to-inferences-between-different-digits"></a>

如果链只能用于同一种数字，那好像就没啥意义了。下面我们将强弱关系的推导稍微推广一下。

### 异数强链关系 <a href="#strong-inference" id="strong-inference"></a>

我们想象一下这种情况。假设一个单元格是双值格（只有两个候选数）。如果我们假设其中某一个候选数为假，那么另外一个候选数就必须为真。因为这个单元格必须要填一个数字进去。当其中一个候选数为假时，意味着这个单元格将会变为唯一余数，因此剩下的另外一个候选数必须为真。

也就是说，如果一个单元格是双值格时，我们仍然可以得到一个节点为假推到另一个节点为真的情况。而这是符合我们之前学习的强弱关系的定义的，确切来说是强关系的这一部分。

是的。我们可以参考这个规则推广一下强链的用法，以让它可以用于不同数字之间进行推理，避免链的推理过程过于单调。

### 异数弱链关系 <a href="#weak-inference" id="weak-inference"></a>

既然强链关系可用于不同数字之间，那么自然弱链关系也可以。

回顾一下弱链关系在同数状态下的用法。我们之前似乎并未特别针对于弱链的论证进行复杂的阐述，这是因为它是普通存在于题目之中的：两个相同的数字，一个填了另一个在同一个行列宫的肯定就不能填了，不管这个行列宫里有多少个相同的这个数的填数位置，2 个也好，更多个也好，这都不重要。

那么对于不同数字之间的弱链关系其实也是类似的，只不过因为是不同数字之间的论证，所以就不能看同行列宫的状态了，而是单元格内的状态。只要相同的一个单元格里，任取一个候选数填入（为真），则这个单元格就永远不可能再填别的数字了。所以这样也就客观存在弱链关系。

所以，总结一下：

* 强链关系
  * 同数：同一个行列宫里只有两处可填位置；
  * 异数：同一个单元格里只有两个候选数。
* 弱链关系
  * 同数：同一个行列宫里的任意两个相同的数字；
  * 异数：同一个单元格里的任意两个候选数。

借用这一点，我们就可以轻松地构造出不同数字之间的强弱关系，并将其用于链技巧里。

## 异数链（Multidigit Chain） <a href="#multidigit-chain" id="multidigit-chain"></a>

<figure><img src="/files/vnAdyMHgrjOPUhyC5xEh" alt="" width="375"><figcaption><p>异数链</p></figcaption></figure>

如图所示。链的记号如下：

```
r3c3(3) == r3c4(4) -- r3c4(9) == r7c4(9) -- r7c4(2) == r7c2(2) -- r4c2(2) == r4c2(3) => {r1c2, r5c3} <> 3
```

我们试着推理一下。

* 如果 `r3c3 = 3`；
* 如果 `r3c3 <> 3`，则因为共轭对的关系有 `r3c4 = 3`，于是同一个单元格里 `r3c4 <> 9`。接着往后一直推理可以到 `r4c2 <> 2`。而因为 `r4c2` 是双值格，所以此时 `r4c2` 变为唯一余数，故有 `r4c2 = 3` 的结论。

所以，`r3c3` 和 `r4c2` 里至少有一个单元格是填 3 的。所以这个题的结论是 `{r1c2, r5c3} <> 3`。

我们就把这种利用了不同数字之间的强弱关系的链称为**异数链**、**多数链**或**多链**（Multidigit Chain）。

我们再来看一个例子。

<figure><img src="/files/Hal8TkBr2JHbv1RDc2BT" alt="" width="375"><figcaption><p>异数链，另一个例子</p></figcaption></figure>

如图所示。链表示如下（这是最后一次用这个表示）：

```
r2c3(8) == r2c3(3) -- r1c3(3) == r1c7(3) -- r3c7(3) == r3c7(2) -- r3c4(2) == r3c4(8) => {r2c6, r3c2} <> 8
```

这个例子也希望你能自己看。

> 这里我需要补充说一句。因为这个链的箭头画起来挺不好弄的，所以对于图中比如 `r3c7` 单元格内的强链关系和前一个例子里 `r4c2` 里的这个强链关系，如果画起来比较困难的话（太短了画不下），以后配图里就不体现了。但是你要知道它是连起来的。

## 尤里卡链记法 <a href="#eureka-notation" id="eureka-notation"></a>

之前我们都用的是完整版的文本描述在表达这些链。显然看起来他们之后只会越来越长。所以我们这里介绍给各位一种简化的写法规范，以便后续描述的时候更为方便和精简一些。

首先，空格全都是不必要的。为了紧凑表述他们，链表达里的所有空格都可以去掉；当然也可以不去掉，这取决于你自己。

其次，我们使用的坐标表示方式是形如 `r2c3(8)` 这样单元格坐标加括号加数字的模式。在链的紧凑写法下，数字 8 是可以提前到坐标之前的，记作 `8r2c3` 或 `(8)r2c3`。这种写法本身并没有简化书写，但它可以配合强弱关系的简化模式。

然后，如果一个强弱链关系发生在一个单元格之中时，单元格坐标就不用展开写，而是将强弱链关系的记号 `==` 和 `--` （以及 `=` 和 `-`）直接写进小括号里。比如 `r2c3(3)==r2c3(8)` 可记为 `r2c3(3==8)` 或者 `r2c3(3=8)`。不过我们在这种简写模式下一般会把括号写在坐标的左边，即 `(3==8)r2c3` 或 `(3=8)r2c3`。

总体通过这四点的简化，链的文本就会显得更为紧凑。比如前面这个例子里的简化写法就是这样的：

```
(8=3)r2c3-3r1c3=3r1c7-(3=2)r3c7-(2=8)r3c4
```

这样就简单不少了。我们把这种简化后的链的文本格式称为**尤里卡链记法**（Eureka Notation）。是的，不用怀疑，这种只用于简化链书写格式的方式，它居然还有一个名字。

至此我们就介绍了定义的部分。之后我们将对这个异数链的内容继续进行展开介绍。


# 头尾异数链的删数规则

Elimination Rule on Nodes with Different Digits

前文我们介绍了异数链的定义，下面我们针对于异数链的特殊情况单独作出说明。

## 头尾异数链（XY-X-Chain） <a href="#xy-x-chain" id="xy-x-chain"></a>

<figure><img src="/files/wlFozxKxUCzxWdCpS1l5" alt="" width="375"><figcaption><p>头尾异数链</p></figcaption></figure>

如图所示，这个链的写法如下（删数部分以后就省略不写了）：

```
4r2c8=4r4c8-(4=3)r4c4-(3=7)r9c4-7r9c9=7r2c9
```

链的推理过程就不多解释了，基本都是一样的。重要的地方是看链的头部和尾部。链头是 `r2c8(4)`，而链尾是 `r2c9(7)`。他们甚至连使用的数字都不相同。

这种链其实也是有删数的。不过这里需要动脑筋想想。我们参考之前链的本质删数逻辑来理解它。链技巧的两种情况最终可以得到两个填数位置至少有一个为真，就是这里的 `r2c8(4)` 和 `r2c9(7)` 有至少一个为真。那么我们不妨看看这个链影响的范畴。

* 如果 `r2c8 = 4`，则所在的行列宫都不能再填 4；**与此同时，`r2c8` 因为填了 4 就不能填别的数了**；
* 如果 `r2c9 = 7`，则所在的行列宫都不能再填 7；**与此同时，`r2c9` 因为填了 7 就不能填别的数了**。

在之前的链里，我们并未补充说明粗体字的这一部分，因为这陈述的是客观事实，也就是废话。但是在头尾都不同数字的异数链里，这个说法会发挥一个特殊作用。首先，`r2c8 = 4` 时，`r2c8` 是不能填 7 的，而这个候选数正好也是 `r2c9` 所在的行列宫的影响范围内。换句话说，当 `r2c9 = 7` 这个情况成立时，`r2c8 <> 7` 这个情况也会成立。

我们把握住这个机会，转去看 `r2c9(4)` 其实也是满足这个规则的：对于 `r2c8 = 4` 时，显然 `r2c9 <> 4`；而对 `r2c9 = 7` 时，`r2c9` 因为填了 7 所以就不能填别的数字了，所以这里照样有 `r2c9 <> 4`。所以，对于这种链，我们的删数仍然是存在的，即 `r2c8 <> 7, r2c9 <> 4`。

我们把这种连链的头尾都使用的不同数字的特殊情况称为**头尾异数链**（XY-X-Chain）。顺着这个思路去思考，头尾异数链是可以最多删两个候选数的。**假设我们使用** $$A(a)$$ **和** $$B(b)$$ **来分别表示单元格** $$A$$ **的候选数** $$a$$ **以及单元格** $$B$$ **的候选数** $$b$$**，那么如果他们俩分别作为链头和链尾的话，那么删数最多可以有两个，一个是** $$A(b)$$**，一个是** $$B(a)$$**。**&#x8FD9;是最正式的表述。

## 不连续环（Discontinuous Nice Loop） <a href="#discontinuous-nice-loop" id="discontinuous-nice-loop"></a>

既然最多能删两个，那自然会有一些情况下只能删除一个候选数。

<figure><img src="/files/PSTeU6yB90LRyTEE4Von" alt="" width="375"><figcaption><p>不连续环</p></figcaption></figure>

如图所示。这个链的表述如下：

```
3r2c2=(3-8)r2c4=8r6c4-8r4c5=(6-8)r4c8=6r4c2
```

这个链的删数只有一处，即 `r2c2 <> 6`。还有一个删数位置本来是 `r4c2(3)`，但题目用了这个提示数 3 了，候选数 3 就不存在了。

我们把只能删除一个数的头尾异数链称为**不连续环**（Discontinuous Nice Loop，简称 DNL）。这么说其实是并不严谨的，因为不连续环还有一种类型，那个类型的逻辑需要依赖不连续环推理过程的另一种思路，而跟删数个数没有任何关系。这个我打算单开一篇内容介绍（虽然内容并不多）。


# 不连续环的两种模式

Two Types of Discontinuous Nice Loop

前面的内容我们介绍了不连续环技巧的逻辑。下面我们将单开一篇内容细致讨论不连续环的更多细节。

## 不连续环的本质推理 <a href="#backing-logic" id="backing-logic"></a>

<figure><img src="/files/ECbcmIp8b7DmsKqk9Vxx" alt="" width="375"><figcaption><p>不连续环，一个例子</p></figcaption></figure>

如图所示。这个链的写法如下：

```
7r2c2=(7-5)r4c2=5r4c9-5r1c9=(5-4)r1c8=4r2c9
```

乍一看，它其实就是很纯粹的不连续环，头尾不同数字，且只能删一个数。不过，这次我们换一个视角去理解它。

这次我们尝试从删数开始推，用最纯粹的填数证矛盾的方式来看这个技巧。假设我们直接让 `r2c2 = 4`，于是我们顺着链头开始推：因为 `r2c2 = 4`，所以占位可以直接得到 `r2c2 <> 7`。这触发了链头为假的条件，于是链就直接不受影响地可以继续往下推理，直到末尾 `r2c9 = 4` 的结论。

然后我们就会发现问题。因为 `r2c9 = 4`，所以同一行又不能填重复的数字。但是最初我们才假设过 `r2c2 = 4`，这就造成了同一行上出现两个 4。或者换一个不太好理解的方式描述的话就是，因为 `r2c9 = 4`，所以 `r2c2 <> 4`。而 `r2c2 = 4` 是假设条件，所以假设和推导过程出现了矛盾，所以假设不成立。

总之就是，因为初始假设是 `r2c2 = 4`，它引发了矛盾，所以假设不成立。“填 4”（或者“4 为真”）是不成立的，那成立的情况自然就是“不填 4”（或者“4 为假”）这个说法了。所以，`r2c2 <> 4` 就这么被得到了。

为什么我非要强迫各位读者用一个不太好理解的方式来理解它呢？因为这个理解方式是可以“取反”的。刚才我们不是假设某个数为真，然后推矛盾得到为假的结论吗？那么不妨改写此情况，看看是否存在假设某数为假，然后推矛盾得到为真的结论。

## 自我约束（Self Constraint）

<figure><img src="/files/kMTPQkVAkbjLVUweHl8V" alt="" width="375"><figcaption><p>自我约束</p></figcaption></figure>

如图所示。这个链的写法如下：

```
2r4c5=(2-4)r5c6=4r5c2-4r4c2=(4-2)r4c8=2r4c5
```

可以很清晰地看出，倘若我假设 `r4c5 <> 2` 时，直接有这条链，并最终把我带到 `r4c5 = 2` 上。

这很奇怪。我们刚开始假设的是 `r4c5 <> 2`，却因为链绕了一圈回到了自己，这么不填到填交替使用，最终反倒还得到了 `r4c5 = 2` 的、和初始假设条件相违背的结果。不用怀疑你自己，这个证明逻辑是没错的，链没有问题。

不过这里要说明白一个点。因为假设为假的节点绕了一圈还能回到自己，但结论却反了过来。这其实是和最初那个不连续环的证明方式完全相同，只是真假性给反了一下。当初我们得到的结果是，因为设为真才能矛盾，而这次却是设为假才能矛盾。

既然设为假能矛盾，也就意味着假设的 `r4c5 <> 2` 本质上是错误的。所以呢？所以为假是错的，那么为真才是对的呗。所以，`r4c5 = 2` 便是这条链的结论。

我们把这种，将不连续环的真假性直接取反得到的新鲜逻辑也称为不连续环，但为了和之前的不连续环区分，本教程给这个技巧单独取了个名字叫**自我约束**（Self Constraint），以和之前不连续环的那种删数模式进行对比和区分。

## 两种不连续环的模型 <a href="#models-on-two-types-of-discontinuous-nice-loop" id="models-on-two-types-of-discontinuous-nice-loop"></a>

下面我们用个简图描述出两种不连续环的构造模式。

<figure><img src="/files/NC7JMqPRLrNzGKnQR1o5" alt=""><figcaption><p>两种模型</p></figcaption></figure>

和之前一样，双实线表示的是强链，单实线是弱链。打叉记号是删数。而“自我约束”这个模式下没有删数结论，和打叉对应的位置上则变为出数结论。

左图的意思是，找到一个链，并在强链两头的这两个候选数对应删除同样的一个数；右图则是需要从出数结论推起，绕一圈回到自己。因为链是固定需要以强链关系开头和结尾的，因此我们不能等同和左图相同的方式将右图简单看成是“以弱链开头和结束并得出自身为真”。这么理解倒也没错，只是不符合本教程最初所给定的链理论的基础规则和定义，会让读者对链的理解有偏差，造成对技巧的理解有歧义，甚至是错误诠释。


# 有技巧名的异数链

Named Multidigit Chain

之前我们介绍了一些常见的异数链以及各种情况下的删数，下面我们来对一些常见的、有命名的异数链继续进行介绍。

## 双值格链（XY-Chain） <a href="#xy-chain" id="xy-chain"></a>

<figure><img src="/files/Z6oHWcUvpSmpliiLfwvt" alt="" width="375"><figcaption><p>双值格链</p></figcaption></figure>

如图所示。链表示如下：

```
(3=1)r6c2-(1=5)r6c4-(5=8)r9c4-(8=9)r8c6-(9=3)r8c9
```

可以看到，这是一个非常巧妙的链——它的所有强链关系均落在了单元格里。我们把这种链称为**双值格链**（XY-Chain）。

## 远程数对（Remote Pair） <a href="#remote-pair" id="remote-pair"></a>

### 基本推理 <a href="#reasoning-of-remote-pair" id="reasoning-of-remote-pair"></a>

<figure><img src="/files/lXGWryR5X0kxbbqB535C" alt="" width="375"><figcaption><p>远程数对</p></figcaption></figure>

如图所示。由于这个技巧比较特殊，所以请暂且允许我省略掉所有的强弱链的箭头。链的写法如下：

```
(2=8)r7c8-(8=2)r2c8-(2=8)r2c6-(8=2)r4c6-(2=8)r4c7-(8=2)r5c9-(2=8)r5c4-(8=2)r8c4
```

如果你只看文本表示的话，你会发现它其实就是特殊一些的双值格链。不过这未免也太特殊了点，所有的双值格居然用的是完全相同的两种数字，这使得链的强链永远都是 2 和 8 两种数字在交替进行。

最后，因为头尾都是 2，所以……欸不对啊。怎么图上删数会这么多？不应该只有 `{r7c5, r8c79} <> 2` 吗？

这就要提及这个技巧的一些特殊性质了。

### 特殊性质 <a href="#features-of-remote-pair" id="features-of-remote-pair"></a>

这个技巧叫**远程数对**（Remote Pair）。听名字就可以看出，它其实跟数对这个技巧有一定的关系。由于它只涉及全盘若干完全一样的双值格，所以我们甚至可以采用之前欠一数组和烟花数组那样的字母假设来看这个技巧。于是我们就有了这样的结果：

<figure><img src="/files/Z02MXFhcyCO1UyeM2GrP" alt="" width="375"><figcaption><p>远程数对，但是代数视角</p></figcaption></figure>

我们从起头的单元格 `r7c8` 开始假设字母，并顺着链用到的单元格逐个进行交替字母的填充。其中 $$a$$ 和 $$b$$ 都是 2 和 8 里的数，不过 $$a \ne b$$。

于是我们就会在这若干个单元格里得到几组不同的跨区数对：

* `r2c8` 和 `r4c7` 是跨区数对；
* `r5c9` 和 `r7c8` 是跨区数对；
* `r7c8` 和 `r8c4` 是跨区数对。

这里并未全部列举。比如 `r4c7` 和 `r8c4` 也是跨区数对，之类的。不过，我们拥有这几组跨区数对后，删数自然就能新增不少。

* `r2c8` 和 `r4c7`：掌管 `r13c7 <> 28`；
* `r5c9` 和 `r7c8`：掌管 `r78c9 <> 28`；
* `r7c8` 和 `r8c4`：掌管 `{r7c5, r8c79} <> 28`。

所以把他们全部放一起，就有了图中的这些位置的删数，这就是远程数对的一大非常重要的特征：**按链的次序，以单元格为单位假设其字母** $$a$$ **和** $$b$$ **交替填入，就会产生若干跨区数对。这些跨区数对不一定都有用，但最终全部产生的删数联立起来就是这个技巧的删数了。**

不过，它还有一些其他的结论，例如**远程数对可以拆解为两条同数链**、**远程数对存在两种不同的连接方式**之类的。不过因为没有什么实质性的影响删数和推理的信息，就留给各位自己私下理解了，这里就不细致阐述了。

## 自噬链（Cannibalism Chain） <a href="#cannibalism-chain" id="cannibalism-chain"></a>

前面的内容我们介绍了各种各样的链，下面我们来看一个删数涉及链节点的情况。

<figure><img src="/files/U65xsT1zQsDYinmrwRv0" alt="" width="375"><figcaption><p>自噬链</p></figcaption></figure>

如图所示，这个链的写法如下：

```
(8=9)r8c9-9r1c9=(6-9)r1c7=6r4c7-(6=8)r4c8-8r9c8=8r9c1
```

很显然，它的删数应该是头尾的交集。头是 `r8c9(8)`，尾是 `r9c1(8)`。他们的交集自然就是 `r8c1(8)` 和 `r9c8(8)` 了。不过这里要注意一个问题。就是这个 `r9c8(8)` 是链的一部分，它能删除吗？一旦被删除，这个链立马就不完整了，那删数还成立吗？

显然，这个删数也是成立的。因为我们得出删数结论之前，链的其中这个节点 `r9c8(8)` 并未删除，所以链能够作为我们使用和推理的其中一环。其次，就算退一万步讲，它已经被删除且已经不在题目里了，而因为我们知道 `r9c8(8)` 因为题目初始的提示数并不能影响到 `r9c8(8)`，因此它初始情况下就是存在的，自然我们就可以学残缺唯一矩形那样把这个候选数给补回去，那么链仍然是成立的。

不管怎么说，这个候选数都是先作为链的一部分，然后引导链成立，最终删除掉，删除逻辑是在链成立之后出现的，所以可以用作删数。我们把这种链称为**自噬链**（Cannibalism Chain）。“自噬”这个词语之前早在拓展矩形里就出现过，不过因为作为术语还需要等以后才能介绍，所以本质上是属于超前就出现了。

## 其他杂七杂八的 wing <a href="#miscellaneous-wing" id="miscellaneous-wing"></a>

之前我们介绍了一堆 wing 技巧，什么 XYZ-Wing 啊、W-Wing 这些。实际上，wing 作为一个系列取名，还有其他的 wing。只不过，前面介绍的可以直接拿来通过分支进行直接推理；但下面要介绍的内容都不能直接推理，必须依赖链的逻辑。

可能你一头雾水。什么叫“可以直接推理”？实际上，XY-Wing、W-Wing 这两个技巧是可以转为链的视角进行理解的，而 XYZ-Wing 这些虽然本身不能直接转化为链，但因为它隶属于 XY-Wing 的分支逻辑进行推广，所以之前介绍的那部分的 wing 是有自己的独特视角的；本质上来看 XY-Wing 和 W-Wing 这俩仍然属于链。

下面我打算把剩下的几种取名看起来非常“混乱”的 wing 一并放到这里说。名字并不重要，记不住也没关系，只是为了让你能知道它是 wing 系列的内容。

### M-Wing <a href="#m-wing" id="m-wing"></a>

<figure><img src="/files/0S3bSRDnyH8nOiVpUC57" alt="" width="375"><figcaption><p>M-Wing</p></figcaption></figure>

如图所示。链表述如下：

```
1r2c7=(1-6)r8c7=6r5c7-(1=6)r5c2
```

这个叫 **Medusa Wing**，简称 **M-Wing**。好比是把 W-Wing 里头尾相同的双值格的其中一个从强链关系改成了弱链关系，然后嵌入到链的中间某个位置，然后因为变为弱链关系了所以又允许往这个单元格增加其他候选数。

### S-Wing <a href="#s-wing" id="s-wing"></a>

<figure><img src="/files/luNeMr8xnmKqI5SzRTtC" alt="" width="375"><figcaption><p>S-Wing</p></figcaption></figure>

如图所示。链的表示如下：

```
5r6c5=5r8c5-(5=6)r9c5-6r9c6=6r5c6
```

这个叫 **Split Wing**，简称 **S-Wing**。用到三个强链关系和 6 个候选数，其中前三个候选数是相同的，后三个候选数是相同的。

### L-Wing <a href="#l-wing" id="l-wing"></a>

<figure><img src="/files/syVYMaoCyhyRBsDtTioM" alt="" width="375"><figcaption><p>L-Wing</p></figcaption></figure>

如图所示，表示如下：

```
4r6c4=(4-6)r1c4=6r2c5-6r2c8=6r6c8
```

这个叫 **Local Wing**，简称 **L-Wing**。前面两个候选数是一样的，后面四个候选数是一样的。

### H-Wing <a href="#h-wing" id="h-wing"></a>

<figure><img src="/files/QVfQUxQtPfO787GMZWHl" alt="" width="375"><figcaption><p>H-Wing</p></figcaption></figure>

如图所示。链写法如下：

```
6r1c8=6r9c8-(6=8)r8c7-(8=7)r7c8
```

这个叫 **Hybrid Wing**，简称 **H-Wing**。H-Wing 说起来会复杂一些，它虽然只用三个强链关系，但会用到三种不同的候选数。三种候选数还有使用次数的要求。比如你看这个链里，按照链的次序依次出现的候选数数字是 6、6、6、8、8、7，编排数字的出现次数分别是 3 次、2 次和 1 次。H-Wing 对这个编排数字的出现次数有要求，要么出现次数是 1 次、2 次和 3 次，要么是 1 次、3 次和 2 次。总之就是很奇葩。

### XY-Wing 和 W-Wing 的链视角 <a href="#chain-view-of-xy-wing-and-w-wing" id="chain-view-of-xy-wing-and-w-wing"></a>

在早期的内容里，我们对 wing 的各种结构进行了介绍。实际上，XY-Wing 和 W-Wing 这两种技巧都是可以改成链的理解方式来进行理解的。

比如，这是一个 XY-Wing：

<figure><img src="/files/dwBna8uny3BuxoMGOqA8" alt="" width="375"><figcaption><p>XY-Wing，但是链画法</p></figcaption></figure>

如图所示。其实就是把拐点 `r4c1` 的两种分支情况，其中一个给反了个方向，并纳入链的假设，就这么简单。

再来看看 W-Wing。

<figure><img src="/files/NEUCZIxomBgoKAlQmFvu" alt="" width="375"><figcaption><p>W-Wing，但是链画法</p></figcaption></figure>

如图所示。这是 W-Wing 的画法。也是讨论的 `c3` 改造成了强链关系。大体上跟 XY-Wing 的改法差不多。

### 各种 wing 的链的写法 <a href="#conclusion-of-miscellaneous-wing-patterns" id="conclusion-of-miscellaneous-wing-patterns"></a>

我相信你肯定记不住前面列举的这些东西。记不住真没关系，也不需要你记住他们。我这里再列一个表来列举他们的链的文本写法，可以用于对照。

<table><thead><tr><th width="93.33319091796875">技巧</th><th width="292.0001220703125">结构（尤里卡记号）</th><th width="100">单元格数量</th><th>是否对称</th><th>是否头尾异数</th></tr></thead><tbody><tr><td>XY-Wing</td><td><span class="math">(a=b)A-(b=c)B-(c=a)C</span></td><td>3</td><td>❌</td><td>❌</td></tr><tr><td>W-Wing</td><td><span class="math">(a=b)A-bB=bC-(b=a)D</span></td><td>4</td><td>⭕</td><td>❌</td></tr><tr><td>M-Wing</td><td><span class="math">(a=b)A-bB=(b-a)C=aD</span></td><td>4</td><td>❌</td><td>❌</td></tr><tr><td>S-Wing</td><td><span class="math">aA=aB-(a=b)C-bD=bE</span></td><td>5</td><td>⭕</td><td>⭕</td></tr><tr><td>L-Wing</td><td><span class="math">aA=(a-b)B=(b-c)C=cD</span></td><td>4</td><td>❌</td><td>⭕</td></tr><tr><td>H-Wing</td><td><span class="math">(a=b)A-bB=(b-c)C=cD</span><br><span class="math">(a=b)A-(b=c)B-cC=cD</span></td><td>4</td><td>❌</td><td>⭕</td></tr></tbody></table>

看出他们的共性了吗？是的，wing 类型的技巧都只用三个强链。

## 错误翻译导致的误会 <a href="#misinterpretion-on-y-wing" id="misinterpretion-on-y-wing"></a>

在中国，Y-Wing 经常被当成是 W-Wing 的别名；而在外国，Y-Wing 则是被看成 XY-Wing 的别名。这里讲一下为什么中国的 W-Wing 有个别名 Y-Wing。从历史上讲，这其实是误传所致。

先来说 XY-Wing 和 Y-Wing。为什么这俩是简称的关系呢？这里要提一下 X 和 Y 在链里的意思是这样的：

* **X 关系**（X-Rule）：两个数具有强链关系，且位于同一个区域下；
* **Y 关系**（Y-Rule）：两个数具有强链关系，且位于同一个单元格里。

对于链的强链关系只涉及 X 关系的就称为 X 关系链，也就是我们之前看到的 X-Chain（同数链）；而对于强链关系只涉及 Y 关系的链则称为 Y 关系链，也就是之前看到的 XY-Chain（即双值格链）。在双值格链里，因为每一个单元格都只有两个候选数，这一点符合 XY 作为未知数理解下的命名，所以双值格链的英文名 XY-Chain 是这么来的；而对于“Y 关系”的这个 Y，更多是出自于“强链的位置关系位于同一个单元格”这个角度去定义的。虽然 Y 在这两种名称定义下含义是不同的，但他们均对应到了同一个技巧上，所以 XY-Chain 从命名上讲，那它也就是 Y-Chain 了。

同理，因为 XY-Wing 只用到三个双值格，所以它其实是 XY-Chain 的一种特例状态（最少单元格数量的双值格链）。所以，XY-Wing 被称为 Y-Wing 也就显得非常合理了。

接着，在早期，前面提及的这些能用链视角来理解的这些各种 wing 在老外的数独论坛（圈子）里也有被称为是叫 Y-Wing Style 的。也就是说，这些所谓的 wing，他们都跟 Y-Wing 的“三个强链”的规则完全一致，属于同一个体系的技巧，所以就拿最常见的 Y-Wing（也就是 XY-Wing）作为代表，称呼这个系列的技巧。很显然，W-Wing 因为定义上符合三个强链，所以也属于这个分类。不过在国内，因为当初理解和对文字的诠释有问题，并最终导致了这个错误，下意识以为 W-Wing 和 Y-Wing 是一个东西了。

这便是技巧名称误传的根本原因。

> X-Wing 是二阶鱼，看起来似乎跟 XY-Wing 的逻辑也不沾边。但是在之后的内容我们会提到，X-Wing 也是有链的视角的，而 X-Wing 命名从根本上没有取一个鱼的名字（反倒是有个 wing 的名字），它的真正原因还是在于 X-Wing 这个技巧比鱼体系诞生要早，所以它比较特殊。它的链的视角也确实比较特殊，而且现在讲有些超纲，因此我们以后再对这个技巧进行补充说明。

## 总结 <a href="#phased-conclusion" id="phased-conclusion"></a>

至此，同数链和异数链的内容就介绍完了。下面我们对目前我们学到的链总结一下。

<figure><img src="/files/O9OSlLNrIBWvF5cNhIF7" alt=""><figcaption><p>链的分类（第一阶段结束）</p></figcaption></figure>

图片里整理了前面全部学过的、有技巧名称的链的类型，以及他们划分的分类。这个图以后还会继续往后延伸。链是一个非常庞大的体系，所以我们还不能掉以轻心。


# 区块链

Grouped Chain

之前的内容我们介绍了基础的强弱链关系的推理过程，以及他们产生的各种链的形式。本文将继续针对链理论进行展开，不过这次我们会把强弱链关系从单个候选数之间的关系推广到一组候选数之间的关系。

## 空矩形（Empty Rectangle） <a href="#empty-rectangle" id="empty-rectangle"></a>

<figure><img src="/files/rI1gvWpg1xOyiCBcWXyi" alt="" width="375"><figcaption><p>空矩形</p></figcaption></figure>

如图所示，这是一个链，只不过这个链的长相比较特殊一些。这要怎么推理呢？

前面的 `r8c5(9)` 和 `r8c7(9)` 的强链关系和之前一样就不多解释了。主要是从 `r8c7(9)` 开始稍微不一样。这里我们暂时可以认为是“逻辑上因为 `r8c7 = 9` 导致了 `r123c7 <> 9` 的结论”，所以 `r8c7(9)` 可以同时跟 `r1c7(9)`、`r2c7(9)` 和 `r3c7(9)` 都成为弱链关系。因为他们均是弱链关系（或者说可以同时得到 `r123c7(9)` 为假的情况），那么我们干脆就拿着这三个删数结论继续往后推。

因为 `b3` 只有 5 个位置可以填 9，而其中的 3 个位置被刚才的结论给排除掉了，所以我们可以认为 `r1c89(9)` 此时是必须有其中一个候选数为真的（也就是这是个区块的意思）。那么我们就可以理解为是因为 `r8c5(9)` 为假时，可以得到 `r1c89(9)` 的区块成立。

因为链还有一个情况是 `r8c5(9)` 为真，所以联立两个情况，最终可以得到一个结论是要么开头这个单元格 `r8c5` 填 9，要么最后这个 `r1c89(9)` 区块为真。

虽然我们还不知道如何表述成链，但是我们得到了类似链应该有的结论，删去头尾的交集。只不过结尾是一个区块。当区块成立时，应按区块的方式删数，所以就是所在行和所在宫的其他单元格的候选数 9；而开头那个就不说了。

那么联立起来可以得到，交集此时只有 `r1c5(9)` 这一个候选数。所以，这个题的结论就是 `r1c5 <> 9`。

我们把这个技巧称为**空矩形**（Empty Rectangle，简称 ER）。下面我们针对于空矩形的结构继续说明一下区块的部分。

## 区块节点的真假性 <a href="#states-on-grouped-node" id="states-on-grouped-node"></a>

前面的空矩形让我们暂且知道了推理的大致逻辑，只不过这里有一些我们还不够“体系化”去整理出来的地方。

先是，怎么用链的形式表示它。要表示成链，那么我们首先需要把这个结构的 `r123c7(9)` 和 `r1c89(9)` 理解一下。这里我们介绍一下**区块节点**（Grouped Node），并且把带有区块节点的链称为**区块链**（Grouped Chain）。

区块节点指的是一个节点并非只用一个候选数，而是一组候选数。比如这里的 `r123c7(9)` 和 `r1c89(9)`。而之所以把他们俩设置为区块节点是有原因的。下面我们来说一下区块节点的真假性和强弱关系的定义。

* **区块节点为真**：区块成立，这一组候选数里至少有一个候选数最终为真；
* **区块节点为假**：区块不成立，这一组候选数的所有候选数均为假。

“区块节点为真”是比较好理解的，这个说法和我刚才说 `r1c89(9)` 的区块成立是一个效果。主要是“区块节点为假”为什么要这么定义。其实稍微思考一下就可以理解，因为它就是为真的反面情况。“至少有一个候选数为真”可以描述为“有 $$\ge 1$$ 个候选数为真”。既然都 $$\ge 1$$ 了，那么反面情况只能是 $$= 0$$ 了，毕竟不能小于 0。

既然有区块节点的真假性定义了，下面强弱链关系就可以把区块节点也纳入进来了。如果我们把这里 `r123c7(9)` 和 `r1c89(9)` 视为链的节点的话，那么这个链就符合了我们前面推导的所有逻辑了。也就是说，前面那条链的写法是这样的：

```
9r8c5=9r8c7-9r123c7=9r1c89
```

其中的 `9r8c7-9r123c7` 是因为 `r8c7(9)` 为真时，可得到 `r123c7(9)` 这个节点里所有候选数全为假，故此时满足“`r123c7(9)` 为区块节点时为假”的定义；与此同时，因为这个区块节点为假，所以可直接得到 `r1c89(9)` 为区块成立的情况，所以又可以得到这个区块符合“区块节点为真”的定义。

所以，这么定义是合适的，逻辑也是无懈可击的，因此结论就可以正常得到。只是说，因为区块节点作为了链尾，所以需要在判断删数交集时要找准位置。

顺带一提，空矩形技巧指的是同数的双强链，且其中有一个强链的两头是同一个宫里的区块节点强链。当这个区块节点的强链都不是区块后，这个技巧会退化为多宝鱼。

## 来看一些真正的例子 <a href="#basic-examples" id="basic-examples"></a>

下面我们来看一些真正的例子。&#x20;

### 同数区块链（Grouped X-Chain） <a href="#grouped-x-chain" id="grouped-x-chain"></a>

<figure><img src="/files/JnvHidd4UD9gSq3qcdts" alt="" width="375"><figcaption><p>同数区块链</p></figcaption></figure>

如图所示。这个链的写法如下：

```
9r1c8=9r2c7-9r89c7=9r7c9-9r7c2=9r89c1
```

可以看到，这是一个很普通的链，只不过是同数链。按照删数逻辑来看，就是链的两端的删数的交集。从前面的知识点里我们知道，它的删数肯定是 `r1c1(9)`，所以这个题的结论就是 `r1c1 <> 9` 了。

我们把这个技巧称为**区块同数链**或**同数区块链**（Grouped X-Chain）。当然，前面的空矩形就属于是同数区块链的其中一个特例。

### 异数区块链（Grouped Alternating Inference Chain） <a href="#grouped-alternating-inference-chain" id="grouped-alternating-inference-chain"></a>

下面再给各位看一个普通的例子。

<figure><img src="/files/NVR9tRtJvJLWg1LJl5YG" alt="" width="375"><figcaption><p>异数区块链</p></figcaption></figure>

如图所示。这条链表示如下：

```
(5=2)r2c5-2r2c2=(2-5)r3c2=5r3c79
```

可以从链结构看出，这是一个异数链；而因为它用了区块节点，所以是**异数区块链**（Grouped Alternating Inference Chain，简称 GAIC）。

我觉得这种技巧的基础逻辑已经说够了。下面我们将针对于区块链的特殊删数逻辑进行描述。

## 特殊删数规则 <a href="#special-rule-on-elimination" id="special-rule-on-elimination"></a>

对于区块链而言，因为它的区块节点的特殊性，所以删数有时候会不太好理解。下面我们继续讨论区块链的一些特殊样貌。

### 区块不连续环（Grouped Discontinuous Nice Loop） <a href="#grouped-discontinuous-nice-loop" id="grouped-discontinuous-nice-loop"></a>

<figure><img src="/files/NUfEE0bxwyZGtR52S8n7" alt="" width="375"><figcaption><p>区块链</p></figcaption></figure>

如图所示。这个链的逻辑如下：

```
5r6c5=5r6c4-(5=7)r1c4-7r2c6=7r45c6
```

可以看出，这是一个头尾异数链；而因为删数只有一个，所以是不连续环；而又因为这里用到了区块节点，所以是**区块不连续环**（Grouped Discontinuous Nice Loop，简称 GDNL）。

先别急。推理过程是很好理解的，这里不好理解的是删数。下面我们针对于删数说明一下，为什么这个头尾异数的时候，删这个候选数。

首先我们可以知道的是，区块链的删数仍然是看头尾的交集。这里我们必须分两种情况讨论：

* 如果 `r6c5 = 5`，则 `r6c5` 因为占位填了数所以其余候选数都可以删除，所在行列宫的其余候选数 5 也可以删数；
* 如果 `r45c6(7)` 区块成立，则所在列和所在宫的其余候选数 7 都可以删除。

在当 `r6c5 = 5` 时，因为占位填了数字，所以 `r6c5(7)` 是满足删除条件的；而对于 `r45c6(7)` 而言，`r6c5(7)` 也属于是可以排除的范围，所以这个删数是可以的；但是，还有其他删数吗？

可能你会问，对于 `r45c6` 这两个单元格而言，假设候选数 5 是存在的，那还能删吗？实际上也是不能的。因为在当 `r45c6(7)` 区块成立的时候，能排除的范围其实压根就没有 5 什么事情，因为它是一个 7 的区块；其次，从更贴近区块本质的理解来看的话，因为这个区块的本质是“至少有一个单元格填 7”，而你并不能确保具体是哪一个位置，所以也就不可能知道 5 的删数是否真正意义上成立。

### 节点重叠（Node Collision） <a href="#node-collision" id="node-collision"></a>

<figure><img src="/files/KPf4pLFmlNVtiRP39fEO" alt="" width="375"><figcaption><p>节点重叠</p></figcaption></figure>

如图所示。这个链的表述如下：

```
4r1c46=4r1c8-4r5c8=4r5c56-4r6c4=4r13c4
```

这是一个比较特殊的同数区块链——它的头尾的两个区块节点“避无可避”地用上了同一个候选数 `r1c4(4)`。不仅我们无法规避这个情况，而且它的删数也是个问题。

从基础的推理我们可以轻松得到 `{r2c5, r3c6} <> 4` 两个删数。但我们并不打算关心他俩，而是 `r1c4(4)`。试问各位，这个 `r1c4(4)` 能否删除？

答案是不能的。因为我们只能得到 `r1c46(4)` 区块和 `r13c4(4)` 区块的其中至少一个区块成立。而如果我尝试故意让 `r1c4 = 4`，从定义上讲，它同时满足了两个区块成立的情况，这就使得两个区块节点同时为真了。但是，在之前我们就强调过，链的头尾是可以同时为真的，所以“两头的区块节点同时为真”的情况并不应该被我们忽略掉，甚至是视为错误的说法。因此，这个交叉重叠的点位 `r1c4(4)` 并不能被我们删除。

我们把这个链的头尾共用同一个或同几个候选数的链称为**节点重叠**、**区块重叠**或**区块撞车**（Node Collision）。尤其要注意的是，重叠的部分是不能删除的。

不过要注意的是，当且仅当链的头尾才有可能出现这种情况。对于强弱链关系在链的中间某一截的时候，这种重叠现象是可以避免的，或者说可以不看成重叠的状态的。比如说之前的空矩形技巧。

### 节点重叠只会发生在不相邻的节点上 <a href="#node-collision-can-only-be-appeared-in-not-adjacent-nodes" id="node-collision-can-only-be-appeared-in-not-adjacent-nodes"></a>

之前的空矩形我们是将它在 `b3` 的部分看成了两个区块的强链关系。不过我估计也有对推理比较敏感的朋友可能会把这两个区块直接看成 `r123c7(9)` 和 `r1c789(9)` 这两个区块节点之间的强链关系。

这其实也没有问题，甚至可以说也是完全正确的强链关系。因为当 `r123c7(9)` 区块节点为假时，`r1c89(9)` 是为真的。而 `r1c7(9)` 虽然此时隶属于 `r123c7(9)` 这个区块节点，所以它此时是为假的，但是把他也纳入 `r1c89(9)` 构成 `r1c789(9)` 时也不会影响这个区块为真的成立，因为我们说的是 `r1c89(9)` 里有一个 9 是为真的，而 `r1c789(9)` 只是含了一个不相关的单元格而已。它的真假我们并不需要关心，因为我们已经知道，这三个候选数整体肯定会有至少一个 9 为真的状态成立，也就是说三个候选数看成整体后，仍符合区块节点为真的说法。所以，此时我们“强行”视为一起的情况，进而故意构造出重叠的现象也是不影响区块链成立与否的。

不过，与其说不影响成立与否，倒不如说这么做反而会导致链的理解成本变高，所以不建议这么做。真有避无可避的重叠情况出现了，那么它一般也只会出现在两个并未直接通过强弱关系相连的、相邻两个节点上。比如说链的头尾。

至此我们就把区块链的内容全部结束了。下一节我们将进入到更复杂的链理论的学习。


# 待定数组链（ALS 链）

Almost Locked Set Chain

下面我们将进入到待定数组链的学习中来。待定数组链的内容主要是让链里嵌入一些数组相关的结构，以延续推理过程，产生更复杂的推理逻辑的一种思路。不过因为他的内容比较难，所以也会拆为多个部分逐个讲解。


# 链关系的第二定义

The Second Definition of Inferences

这部分的内容将会带领我们将链理论的推理逻辑变得更加灵活。但是，因为内容会进一步推广链理论的内容，所以难度也会增大，所以不要走神。我们娓娓道来。

## 待定数组 XZ 逻辑（Almost Locked Set XZ Rule） <a href="#almost-locked-set-xz-rule" id="almost-locked-set-xz-rule"></a>

### 先从双值格链的视角告诉你链是成立的 <a href="#i-will-tell-you-this-pattern-is-correct" id="i-will-tell-you-this-pattern-is-correct"></a>

<figure><img src="/files/Q1LW6JQT6VGvviI5maRc" alt="" width="375"><figcaption><p>待定数组 XZ 逻辑</p></figcaption></figure>

如图所示。这条链的表示如下：

```
7r2c3=5r2c4-5r3c6=7r8c6
```

这个链上来就给了我们一个下马威。因为上来的强链关系就已经不寻常了：它居然用的是两个不相同的单元格的异数强链关系。后面 `5r3c6=7r8c6` 也是如此。这是怎么实现的？

我们仍旧利用之前的逻辑来推理。链的逻辑要让我们先假设头部的两种真假性的情况。对于真就不多说了，主要是假设为假的情况。假设 `r2c3(7)` 为假，则我们看粉色的两个单元格 `r2c34`。此时，`r2c3` 只会剩下候选数 4，于是它肯定填的是 4（或者我们可以说 `r2c3(4)` 为真，即 `(7=4)r2c3` 的强链关系）。

然后，因为 `r2c3(4)` 为真后，此时 `r2c4(4)` 会为假。然后又因为 `r2c4` 是双值格，所以 `r2c4(5)` 此时为真，所以这么串起来就有了 `(7=4)r2c3-(4=5)r2c4` 这么个链。然后，有了 `r2c4(5)` 为真的结果后，`r3c6(5)` 自然就为假了。这一步是废话。

然后，和前面一致的逻辑是，我们还要继续借用下所有青色的三个单元格。因为 `r3c6(5)` 为假，所以 `r3c6(2)` 为真，然后 `r9c6(2)` 为假，`r9c6(4)` 为真，`r8c6(4)` 为假，最后得到 `r8c6(7)` 为真。

很显然，按照这么看的话，这是一个非常臃肿的双值格链。但是，这是为了给你介绍链成立才迫不得已这么解释的。下面我们换另外一个视角，把涂色的单元格当成整体，并直接讨论前面文本描述的那般形式。

### 待定数组的视角 <a href="#almost-locked-set-view" id="almost-locked-set-view"></a>

先看粉色的两个单元格。既然我们可以通过双值格链的视角知道 `r2c3(7)` 为假时可以得到 `r2c4(5)` 为真，那么这是否是一种特别的强链关系呢？

看起来是的，好像也挑不出什么毛病。可这似乎太过巧合。因为粉色的两个单元格实在是太过特殊，所以看起来是可以按双值格链的思路顺着这么下去才有的这个结果。所以这并不能说服我们将这个强链也适用于任何普通的情况。更何况，我们都不清楚什么时候才能叫“普通的情况”。

那么我们来看看数组的视角。我们先看粉色的两个单元格。这两个单元格里一共有三个候选数 4、5、7，刚好比单元格数量多一个。因为答案最终是只能填俩数字进去的（毕竟就两个单元格嘛），所以肯定会有一个数是多出来的。

在有这个前置知识点后，我们来看下青色的部分。青色的部分是三个单元格构成，但是里面有 2、4、5、7 一共四种数字出现，也刚好只比单元格数量多一个。

如果我们设 `r2c3(7)` 为假，则此时粉色的两个单元格 `r2c34` 仅剩下两种数字（因为 7 就这一个），于是它变为了一个显性数对（当然，只是少了一个 5 而已，但并不影响数对的形成，毕竟这一点之前老早就说过了）。但是，如果此时我们还让 `r2c4(5)` 为假的话，那么粉色的单元格里 5 和 7 都会消失，此时两个单元格就会只剩下一种数字 4，这显然是违背数独规则的。所以，`r2c4(5)` 此时不得不为真。

同理，对于 `r3c6(5)` 为假而言，如果 `r8c6(7)` 也为假，则青色的四个单元格里 5 和 7 全部会消失，于是只会剩下 2 和 4 这两种数字。可青色一共有三个单元格，这也是放不下的。所以，`r8c6(7)` 此时也是不得不为真的状态。

于是，我们就有了两端强链关系的新的解释：**在“待定”的数组结构里，如果在假设了其中一个数字的全部位置都为假时，数组就会形成；但是如果我们还要强制让其中另外一种数字全部位置都为假的话，那么这个数组就相当于同时少了两种数字。本身这个“待定”的数组结构里数字种类数也就比单元格数量多了一个，但一次少两种数字，**$$n + 1$$ **就会直接变为** $$n - 1$$ **种，进而产生直接的矛盾**。

> 对于粉色的两个单元格而言，因为显然 $$n$$ 值看起来比较小，所以直接矛盾的点看起来并不需要这么解释；不过为了确保这个说法的严谨性，这么写一遍是可以覆盖粉色的这种规格的情况的：$$n = 2$$ 个单元格，一共有 $$n + 1 = 3$$ 种候选数；当同时少掉两种候选数后，变为 $$n - 1 = 1$$ 种数字填写到两个单元格里，所以就矛盾了。

这便是本内容需要告诉大家的核心思路：使用数组整体进行推断的模式，这样可以直接得到强链关系的推导过程，避免中间采用双值格链那样一步一步的推演。

我们把图中粉色的这一块，以及青色的这一块都称为**待定数组**（Almost Locked Set，简称 ALS）。其中 Locked Set 在英语环境下也可以指 Subset，即数组的英文，所以 Almost Locked Set 也可以视为是 Almost Subset 的规范写法，即“差一点的数组”。另外，我们把使用了待定数组的链就称为**待定数组链**（Almost Locked Set Chain 或 ALS Chain）。

现在我们看到的是待定数组里最简单的部分，它只需要两个待定数组就行。我们把这种两头是待定数组的双强链称为**待定数组 XZ 逻辑**（Almost Locked Set XZ Rule，简称 ALS-XZ）。还记得 XZ 吗？在全双值格致死解法里它出现过一次，那个技巧叫 BUG-XZ。这里也是一样的。

## 强弱链关系的第二定义 <a href="#the-second-definition" id="the-second-definition"></a>

前面的内容我们已经充分介绍了待定数组的推演规则。下面我们针对于前面的推演规则，着重说明一下链的强弱链关系的另外一种说法。

### 两种定义 <a href="#two-kinds-of-defintions" id="two-kinds-of-defintions"></a>

之前我们学到的是，强弱链的关系是通过真假性直接推演而得到的。不过我们可以从前面待定数组的思维里看到，似乎它又有一些不一样的地方。

这里我们要介绍的是强弱链关系的第二定义。这里我们方便对比，把两种定义写在一起：

* ***第一定义***
  * **强链关系**：如果节点 $$A$$ 为假时可得 $$B$$ 为真，则 $$A$$ 和 $$B$$ 为强链关系；
  * **弱链关系**：如果节点 $$A$$ 为真时可得 $$B$$ 为假，则 $$A$$ 和 $$B$$ 为弱链关系。
* ***第二定义***
  * **强链关系**：如果节点 $$A$$ 和 $$B$$ 不同假，则 $$A$$ 和 $$B$$ 为强链关系；
  * **弱链关系**：如果节点 $$A$$ 和 $$B$$ 不同真，则 $$A$$ 和 $$B$$ 为弱链关系。

这个说法跟前面的比较相似，不过我们似乎因为已经学过了强弱链的定义后，发现这种说法有些奇怪，有点排斥。实际上这个定义方式和原来的真假推演的定义方式在数学上是完全等价的，但是他们带来了不同的解释思维。

这两种定义虽说是等价的，但看起来就不等价。而且，对于这种强弱链关系的定义，我们之前其实还有一些比较不理解的地方，这里我们都可以解释清楚。

### 为什么两种定义是等价的？ <a href="#why-two-definitions-are-equivalent" id="why-two-definitions-are-equivalent"></a>

从定义上看，这俩似乎没有什么直接的关系。要说明两个定义是等价的，我们稍微需要用到一点数学上的知识点。我们这里为了举例说明，就先拿强链关系的定义（第一定义）来简要用文字证明一下。

在高中的课程里，我们学到过一个叫命题与逻辑的内容。对于学的那些内容，我们这里就不多说明了。不过如果你要补学这些内容的话，本教程插入了逻辑学的其中一部分数学知识，方便你衔接他们。详情请参看 [Ⅲ：逻辑学简介](/appendix/02-logic-basics) 这一部分的内容。

命题与逻辑里，我们把一个可以判断对错的陈述句称为一个命题。比如这里强链关系的前半句“如果节点 $$A$$ 为假时可得 $$B$$ 为真”就可以称为一个命题。虽然我们不知道普适情况下这个命题的真假性，但我们可以知道的是这个说法确实可以用于判断对错，所以是一个命题。

而我们还知道，**原命题和逆否命题等价**。对于强链关系的前半句“如果节点 $$A$$ 为假时可得 $$B$$ 为真”而言，它的逆否命题其实就是把“$$B$$ 为真”和“$$A$$ 为假”的位置对调一下，并且把对调后的这两个部分的真假性反转一下（“为假”改成“为真”、“为真”改成“为假”）。

改了之后呢？改了之后就成了“如果节点 $$B$$ 为假时可得 $$A$$ 为真”。注意，这里方向已经反过来了（改成了从 $$B$$ 往 $$A$$ 在推理的这个方向），但因为它是原命题的逆否命题，而逆否命题和原命题等价的缘故，所以原命题能推出的结论“$$A$$ 和 $$B$$ 为强链关系”应当也适用于它的逆否命题，所以我们仍然可以得到 $$A$$ 和 $$B$$ 为强链关系。

这就很神奇了。我们联立两个说法：

1. 如果节点 $$A$$ 为假时可得 $$B$$ 为真，则 $$A$$ 和 $$B$$ 为强链关系；
2. 如果节点 $$B$$ 为假时可得 $$A$$ 为真，则 $$A$$ 和 $$B$$ 为强链关系。

对于两个节点 $$A$$ 和 $$B$$ 而言，不论是从哪一个开始到哪一个结束，总会有一个节点会为真，这说明他们就是不同为假的，即不能同时都处于为假的状态。那它俩能同为真吗？我们在设为假才能得到另外一边为真，而从定义上看，似乎并未体现为真的推理状态，所以我们不能断言是否可以同真的性质，即只能认为两个节点可能也可以同为真，不能排除这个情况。

总之就是，我们借用逆否命题把他换一个说辞，然后联立起来得到两端有一个假，另外一个就必为真，因此才知道他俩不同假的这个新的定义方式。而对于弱链关系而言也是一样的证明模式：借用逆否命题，然后联立两个命题，发现只要有一个为真另外一个就一定为假，因此它俩不能同为真，这便得到了弱链关系的新的定义方式。

因此，链关系的第二定义的等价性就被我们拿捏了。

### 链关系的双向性以及链的双向性 <a href="#why-the-definition-is-bidirectional" id="why-the-definition-is-bidirectional"></a>

下面我们要说的是一个之前初学链理论并未涉猎的问题。我们在假设的时候是需要假设头尾的两种状态的（真和假的两种状态）。其中，设为真的这个状态因为不满足链的推导规范（链必须从假开始推），所以它“夭折”在了起始点。但作为删数所必须拥有的判别情况之一，它又必须存在于链的逻辑之中。

候选数为真的情况单独考虑，但又没有考虑得特别深入，又确实跟链本身是独立的状态。这一点真的很别扭。不过，在我们学习了第二定义后，我们将重新认识这个链理论，并可以告诉大家，这个设为真的情况以后都不用再考虑了（实际以前也可以不考虑，但因为前面的定义不足以解释为什么可以不考虑）。

要解释清楚这一点，我们需要知道链是双向的。所谓链是双向的，指的是链的推理过程不分前后顺序。即一共有四个节点的链 `A=B-C=D` 也可以看成 `D=C-B=A`。这两个写法是等价的。只要有其中一个成立，另外一个就会直接成立。

这一点甚至都不需要完整证明。因为它的证明过程在前面证明定义的等价性时已经提到了。因为链的强弱关系是有逆否命题一说的，而逆否命题确保了强弱链关系都可以逆向推导（比如 $$A$$ 假得 $$B$$ 真的逆否命题是 $$B$$ 假得 $$A$$ 真，这就只是单纯换了个方向的强链关系；弱链关系也是一样），所以把链完整换个方向是完全可以的。

所以链是不区分方向的（或者说两种方向均可推演，所以也可以说是链具备双向性）。之所以前面的配图都画了箭头，一来是因为之前没有办法解释清楚这个问题，所以告诉大家需要有方向地进行逻辑推演；二来也确实是因为链需要有一个方向作为前后关系的搭配。虽然链的方向最终并不重要，但它实际上是需要有一个切入点的作为我们下手的开端，所以我们必须用一个箭头来表示推演的完整流程，方便读者阅读。所以箭头不会因为我这里讲解了双向性之后就省略掉了，以后的话箭头还是会画出来的。

与此同时，因为链是双向都可以推导的，所以链头设为真的情况，其实会被链的另一个方向所覆盖到。什么意思呢？就是说，链不是双向的吗？链头到链尾是一个方向，链尾到链头又是一个方向。而链头为真恰好会被“从链尾到链头”这个推演方向所覆盖。因为从链尾到链头的推导过程下，链尾会被假设为假，而链头会得到为真的状态。这一点早已被链的另外一个方向所覆盖到，所以链自身就带有链头的两种真假状态，因此我们以后都不需要单独对链头进行真假性的讨论，而只需要看链是否成立就行。只要链成立了，链头的真假性也就都会出现，此时直接看头尾交集删数就行了。

## 待定数组的特性 <a href="#feature-of-almost-locked-set" id="feature-of-almost-locked-set"></a>

在说完了理论知识后，下面我们要最后介绍一下待定数组本身的特性。

前面待定数组的最后，我们提到了一段非常长的话。它描述的是，在待定数组里，需要有两种数字全部从盘面里消失，才能造成待定数组的矛盾。那么，如果我们把细致看一下这个话，我们就可以发现，其中一个数的所有位置为假，不就是在说这个数所有位置构成的一个整体，然后这个节点为假吗？所以，待定数组有一个非常重要的特性是：

**待定数组里，任意两种数字之间都是强链关系。**

下面我们来看几个题。

第一个题稍微推广一下前面的结构的长相。

<figure><img src="/files/TQCoxKLRfq9QU1qMjj8C" alt="" width="375"><figcaption><p>第一个推广例子</p></figcaption></figure>

如图所示。这个例子也用到了两个待定数组，不过是 2 和 4 之间的关系。比如粉色的这一个待定数组，2 只有一个位置，但 4 有两个位置，所以所有的 2 和所有的 4 构成强链关系（因为它俩不同假，或者说 4 区块节点为假时可得 `r1c3(2)` 节点为真）。另外青色的这一边也是一样的道理。

需要注意的是，因为链的头尾都是 4 的区块节点，他们均处于同一个宫，所以删数就是 `b1` 里其余单元格的候选数 4。

下面我们再来看一个例子。

<figure><img src="/files/sCBP3PF4eu50Sqqzig7a" alt="" width="375"><figcaption><p>第二个推广例子</p></figcaption></figure>

如图所示。这个例子良好地阐述了前面“同一种数字的全部位置”这个说法。粉色的部分可以先不看，主要是这里的青色的这三个单元格。

青色的单元格一共有四种候选数出现：1、2、3、8。其中 2 只有一个位置，8 倒是出现在了两个位置上，但他俩跨度实在是太大了，一个在 `r8c2`，另一个却在 `r8c8`。

不过这都不重要。就算它俩不是区块节点，我们也可以组合起来看待。当 `r8c6(2)` 为假时，我们可以得到的是 `r8c28(8)` 为真。

在删数时，我们要看的是两头的交集。而此时 `r8c28(8)` 作为整体后，我们知道的是，这个节点为真意味着这个节点的两个单元格里，必须至少有一个位置是填的 8。所以，组合起来其实就是看的 `r5c7`、`r8c2` 和 `r8c8` 链头尾一共三个单元格可以排除到的交集。显然，`r8c7` 是交集上的点位，所以这个题的结论就是 `r8c7 <> 8` 了。

<figure><img src="/files/qmUSRbk7ytLnTMWBwDwY" alt="" width="375"><figcaption><p>第三个推广例子</p></figcaption></figure>

如图所示。这个再一次推广了用到区块节点。不过和前面差不多，所以就不重复说明了。

<figure><img src="/files/GcNwa8zBo8Zj6A1n2Pnb" alt="" width="375"><figcaption><p>第四个推广例子</p></figcaption></figure>

如图所示。呃……越来越奇怪了。不过也是一样的，把尾巴上三个位置结合链头一个位置，看成是找这四个位置的交集就行。


# 有技巧名的待定数组结构

Named Almost Locked Set

本篇内容将带着大家看一些待定数组的固定结构。这些结构因为长相特殊，所以单独列一篇内容介绍他们。

## 待定数组 XY-Wing（Almost Locked Set XY-Wing） <a href="#almost-locked-set-xy-wing" id="almost-locked-set-xy-wing"></a>

<figure><img src="/files/alWaiAXe0vnWQ010bfWP" alt="" width="375"><figcaption><p>待定数组 XY-WIng</p></figcaption></figure>

如图所示。本题用到了三个待定数组结构。链的表示如下：

```
2r6c7=7r6c3-7r3c3=9r1c12-9r1c78=2r1c789|r3c9
```

> 补充一下，尤里卡记号的竖线 `|` 表示类似于之前一组单元格无法简写时，需要用逗号分隔的那个逗号，这只是一个约定俗成。在计算机里竖线也有“或者”的意思，所以这样可以把四个单元格给合并起来。

因为强链关系的推理和之前待定数组需要用到的那些规则完全一样，所以就不重复说明了。总之，结果就是头尾的交集，即 `r3c7 <> 2`。

本题用到了三个强链关系，且三个强链关系全部是从待定数组之中诞生，所以我们把这个结构归纳为待定数组的一种特殊构造。这是今天要学到的第一种，即**待定数组 XY-Wing**（Almost Locked Set XY-Wing，简称 ALS-XY-Wing）。为什么要带一个 XY-Wing 的头衔呢？你把这个链里用到的全部数字排列展开来，你会得到 2、7、7、9、9、2 的序列。在之前 [有技巧名的异数链](/chain-theory/02-x-chain-and-multidigit-chain/04-named-multidigit-chain#chain-view-of-xy-wing-and-w-wing) 的内容里，我们介绍到 XY-Wing 的链的格式。你可以仔细对比一下，它的排列（尤其是数字的序列）和这里的这个排列模式完全一样，因此我们给这个技巧冠了个 XY-Wing 的名。

下面我们再来看一个例子。

<figure><img src="/files/177pYNu5by21zCagS1FF" alt="" width="375"><figcaption><p>另一个待定数组 XY-Wing</p></figcaption></figure>

如图所示。这个稍微有些别扭的是这个尾部的 7 跨度实在是有些大。不过例子还是比较清晰的，所以就自己看了。

下面我们再来看一种构造模式。

## 待定数组 W-Wing（Almost Locked Set W-Wing） <a href="#almost-locked-set-w-wing" id="almost-locked-set-w-wing"></a>

下面我们来看带 W-Wing 的构造模式。

<figure><img src="/files/rC6cwKp9Rl8RKlqiSyJW" alt="" width="375"><figcaption><p>待定数组 W-Wing</p></figcaption></figure>

如图所示。这个链的写法如下：

```
9r7c3=5r2c3-5r1c1=5r1c9-5r8c9=9r7c79
```

可以看出，和前面 XY-Wing 类似，它用了两个待定数组，且构造的方式使用了 W-Wing 的模式。所以这个我们把他叫做**待定数组 W-Wing**（Almost Locked Set W-Wing，简称 ALS-W-Wing）。

我们再来看一个抽象一些的例子。

<figure><img src="/files/QvqrT1xDcMEcvgwnwbyW" alt="" width="375"><figcaption><p>另一个待定数组 W-Wing</p></figcaption></figure>

如图所示。这个链的写法如下：

```
3r14c9=6r1c9-6r1c8=6r6c8-6r6c7=3r4c79|r6c7
```

这个例子看着确实抽象了一些，主要问题是它用到了两个地方有些和之前的例子不同。第一个是 `r4c9` 单元格是同时被两个待定数组使用的（属于是叠起来了）；第二个是链的头尾也复用了 `r4c9(3)` 这个候选数。

第一个待定数组可以得到 3 和 6 在 `r14c9` 里的强链关系，第二个待定数组则可以得到 3 和 6 在 `r4c79` 和 `r6c7` 三个单元格内的强链关系。

我们再来看一个例子。

<figure><img src="/files/WszssMPJ0m6IuxCER66E" alt="" width="375"><figcaption><p>区块待定数组 W-Wing</p></figcaption></figure>

如图所示。这个链的写法如下：

```
8r1c1=1r1c8-1r2c89=1r2c4-1r5c4=8r5c78
```

这一次我们仍然是用的 W-Wing，不过 `r2` 数字 1 的强链关系是带区块节点的。

## 待定数组双值格链（Almost Locked Set Chain） <a href="#almost-locked-set-chain" id="almost-locked-set-chain"></a>

下面我们继续推广待定数组的使用次数。不过因为过多使用待定数组会造成结构越来越难在平时做题时遇到，所以看看就行了，不用考虑怎么找的。

当然，因为再次推广了使用待定数组的次数，所以就不太像是 wing 应该有的样子了。只能说是它是从刚才 XY-Wing 的情况再次推广得来的。

<figure><img src="/files/NnOaf24KACAMQOzaHyrc" alt="" width="375"><figcaption><p>待定数组双值格链</p></figcaption></figure>

如图所示。它的写法如下：

```
6r7c6=8r7c8-8r46c8=3r5c7-3r5c13=7r4c2-7r7c2=6r8c3
```

本题用了四个待定数组，图中分别使用了粉色、蓝灰色、橘色和黄色四种颜色表示。不过要注意的是，这四个待定数组的头尾两个（粉色和黄色这两个待定数组）是重叠了的，它同时用了 `r7c2` 这个单元格。

我们把这个就称为**待定数组双值格链**（Almost Locked Set XY-Chain）。在 HoDoKu 软件里，这个技巧叫做 ALS Chain（ALS 链、待定数组链），不过容易和教程后期的普通待定数组搭配链的逻辑造成冲突，就不采用这个说法了。

## 待定数组的定义范畴 <a href="#definition-field-of-almost-locked-set" id="definition-field-of-almost-locked-set"></a>

考虑这个例子：

<figure><img src="/files/NbyUVsTgSyZFkgmvxoi0" alt="" width="375"><figcaption><p>待定数组 W-Wing（？）</p></figcaption></figure>

如图所示。它的表示如下：

```
(4=5)r8c1-5r7c3=5r3c3-5r3c79=4r12c8
```

从数字上看，它确实符合 W-Wing 的模式。但是仔细数数，它只用了一个待定数组，即右上角 `r12c8` 和 `r3c79` 四个单元格的这个待定数组。

不过，我们要强行这么看似乎也行。待定数组的定义不是 $$n$$ 个单元格里包含 $$n + 1$$ 种不同的数字吗？如果 $$n = 1$$ 的话，定义就会变为指代一个双值格。那么对于这个链里的 `r8c1` 来说，这一个单元格就应该算一个待定数组。那么这么强行看的话，那么这个例子也符合待定数组 W-Wing 的定义。

是的。这的确有些反直觉，但是它确实是正确的：**双值格是特殊的待定数组**。数组在我们最开始学的时候就要求规格必须至少两个单元格（因为一个没有意义）。但是对于待定数组而言，由于它不能直接用，所以待定数组只能配合其他的内容才能发挥效果。所以，在待定数组的世界里，双值格这种只用一个单元格却符合定义的情况并不少见。双值格因为符合待定数组的定义，所以也确实被算成一种特殊的待定数组（规格最小的情况）。

至此我们就把待定数组的一些常见构造模式（算上之前 ALS-XZ 一起），就全部结束了。下面我们将带着大家看看待定数组在普通的链里的用法。


# 在链里的待定数组

Other Use Cases of Almost Locked Set

下面我们来看一些普通的用法。

## 例子 1 <a href="#example-1" id="example-1"></a>

<figure><img src="/files/u8GVYA2Gq0g7YYuR7V8k" alt="" width="375"><figcaption><p>第一个待定数组区块链例子</p></figcaption></figure>

如图所示。这个链的写法如下：

```
2r5c7=3r5c2-3r79c2=2r7c1-2r2c1=2r2c79
```

删数是头尾三个位置 2 的交集。

## 例子 2 <a href="#example-2" id="example-2"></a>

<figure><img src="/files/pCg8PZVWS0LqwF6QfkqC" alt="" width="375"><figcaption><p>第二个待定数组区块链的例子</p></figcaption></figure>

如图所示。这个链的写法如下：

```
7r8c8=7r2c8-(7=8)r2c2-8r9c2=7r7c1|r8c3|r9c2
```

这个题别看就用了一个待定数组，但是它真的很……不好看。左下角的这三个 7 的摆放实属有些过分了。

## 例子 3 <a href="#example-3" id="example-3"></a>

<figure><img src="/files/0D5KTM3PIFO0surPyUsd" alt="" width="375"><figcaption><p>第三个待定数组区块链的例子</p></figcaption></figure>

如图所示。这个是节点重叠技巧的例子。写法如下：

```
4r5c2=4r5c5-4r7c5=9r7c45-9r9c4=9r9c3-9r6c3=4r5c2|r6c3
```

这个例子的链头是 `r5c2(4)`，而链尾是 `{r5c2, r6c3}(4)`。有点像克莱因瓶的效果。

因为删数是取头尾的交集，而头尾的交集看的是两组候选数在合并后，每一个位置的交集，而因为链头的候选数完整被链尾所涵盖，所以看起来其实就是在删链尾的交集。所以结论就是 `r4c3 <> 4` 了。

至此我们就把待定数组的内容结束了。下面我们还得继续讲解后面的内容。


# 隐性待定数组链（AHS 链）

Almost Hidden Set Chain

下面我们接着看另外一种待定数组的用法。

## 还是先从例子入手 <a href="#a-simple-example" id="a-simple-example"></a>

<figure><img src="/files/QmE0kZYtME9rKVNSgpYG" alt="" width="375"><figcaption><p>隐性待定数组链</p></figcaption></figure>

如图所示。这个链的写法如下：

```
3r1c1=3r1c4-5r2c46=5r2c13
```

我们很快就发现了端倪。这里居然有一个弱链关系直接连接了两个不同的数字节点：`3r1c4-5r2c46`。这是怎么得到的呢？

其实很简单：我们仔细观察 `b2`，就可以发现这个宫里，数字 1 和 9 只能填入到 `r1c4` 和 `r2c46` 三个单元格里。

然后回忆一下之前强弱链关系的定义是怎么说的。如果两个节点不同为真，那么这两个节点就可以定义为弱链关系。这个地方它满足吗？显然是满足的。因为如果我们让这两个节点为真，就意味着 `r1c4 = 3` 和 `r2c46(5)` 的区块同时成立。而只要成立，数字 1 和 9 就放不下了，因为 1 和 9 至少需要两个单元格安放。但是一个区块节点和一个候选数节点同时为真，起码至少用到两个单元格。于是，1 和 9 就放不下了。这样就会造成矛盾。所以，这两个节点的弱链关系是成立的。

于是，整个链就连通了。我们就可以得到这个区块不连续环的结论：`r1c1 <> 5`。

这里我们就把 `3r1c4-5r2c46` 这个弱链关系的证明来源称为一个**隐性待定数组**（Almost Hidden Set，简称 AHS）。

## 隐性待定数组的样貌

显然我们不足以通过一个简单的例子解释我们要说的东西。我们来看这个示意图。

<figure><img src="/files/n1JHFhle2q0cIE0oemvS" alt="" width="375"><figcaption><p>隐性待定数组示意图</p></figcaption></figure>

如图所示。我们假设这个图里 `b2` 只有这三个高亮出来的单元格 `r1c4`、`r3c45` 能填 3 和 4，剩下的空白位置都不能填 3 也不能填 4（注意是 3 和 4，不是 1 和 2）。

因为整个宫里只有三处位置可以填两种数字 3 和 4，我们就把这三个单元格称为一个隐性待定数组。为什么？因为我们无法确保 3 和 4 最终落入这三个单元格的其中哪两个，这一点和之前待定数组的思路完全一样。

那么，这里可以用到的结论是什么呢？结论用的是在这三个单元格的、不是 3 和 4 的其他数字。比如这个例子里我们故意让它含有候选数 1 和 2。结论就是，只要我们找到两个节点用到至少两个单元格即可。只要这两个节点同时为真的时候用掉三个单元格的其中两个，这样 3 和 4 就一定放不下，于是就会矛盾。

比如这个示意图里，`r1c1(1)` 可以和 `r3c4(2)` 形成弱链关系。同真时，`r1c1 = 1` 和 `r3c4 = 2` 成立，此时 3 和 4 就放不下了。

可以从示意图看出，大多数时候它的结论都是相对待定数组而言更为鸡肋一些的。所以，隐性待定数组的使用比起普通的待定数组而言会少很多。

## 让我们带着前面的内容再看一个例子 <a href="#another-example" id="another-example"></a>

<figure><img src="/files/XtTsW3DVhjsAm49zWkSm" alt="" width="375"><figcaption><p>第二个隐性待定数组链例子</p></figcaption></figure>

如图所示。这个链的写法如下：

```
(9=1)r7c6-1r7c2=1r9c1-7r5c1=(7-6)r5c7=6r5c8-(6=9)r9c8
```

可以看出，左边 `c1` 里的这个隐性待定数组规格较大，不过也好理解：因为两个候选数 1 和 7 同真时会造成 3、4、6、9 放不下 3 个单元格（本身 5 个单元格，但两个候选数同真会占用掉其中两个，所以只剩下三个位置了）。

至此我们就把隐性待定数组的内容结束了。它的用法确实会少一些。


# 毛刺数组链

Burred Subset Chain

下面我们继续学习待定数组的内容。不过这次我们将会结束数组链的全部内容。

## 毛刺显性数组 <a href="#burred-naked-subset" id="burred-naked-subset"></a>

我们还是先来看一个例子。

<figure><img src="/files/QWKzU5lwvMEu8JXVcqkQ" alt="" width="375"><figcaption><p>毛刺显性数组链</p></figcaption></figure>

如图所示。这个链的写法如下：

```
7r7c6=(7-1)r8c6=1r9c5-1r9c1=37r9c13
```

这个链的特殊之处在于，它有一个节点非常不寻常：`r9c13(37)` 是一整个节点，一共有四个候选数。

从之前待定数组的内容里我们知道，其实链尾这里的强链关系是 `1r9c1=7r9c13` 就行，删数也是 OK 的。不过，这里我们换个视角，方便我们找的视角：显性数组。

我们就强制性把 `r9c13(37)` 看成一个整体（显性数对结构当成一个节点），然后试着让它和 `r9c1(1)` 连起来。不过看起来似乎是可行的。只是从理解上来说，会稍微麻烦一些。数组节点怎么看真假性？

之前我们在解释区块节点的时候，说的是“区块节点的真假性直接看区块是否成立即可”。先从“成立与否”切入，然后再看它底层的一些候选数摆放模式。数组也是一样。如果数组节点为真，我们就认为数组结构成立即可；相反，如果数组节点为假，就认为数组不成立。

直白点说，对于例子里而言，数组节点为真就说明 `r9c13` 这两个单元格一个填 3，另外一个填 7。那么，如何得到这个情况成立呢？只要 `r9c1(1)` 不存在就行。换言之，如果 `r9c1(1)` 为假，则这个数组就直接会成立，于是数组节点为真就有了。

和前面的链的推理过程如出一辙，直接从头连到尾，只不过这次尾巴上吊着的是一个数组而不是区块也不是普通的候选数。

这个链成立，自然就需要我们找删数。那么这次我们要看的是候选数 `r7c6(7)` 和数组 `r9c13(37)` 的交集。那同时假设一下这两头节点为真的情况，看看都能删哪些位置，然后取交集就行了。那么对这个题来说，可用的位置只有 `r7c1(7)`。所以，`r7c1 <> 7` 便是这个例子的结论。

对于 `r9c13(37)` 这种直接看不是数组，但外部挂了个节点连进来的这种数组形态，我们就称为**毛刺数组**（Burred Subset）；而我们把这种用了毛刺数组的链称为**毛刺数组链**（Burred Subset Chain）。这是显性数对，所以毛刺数组又可以称为**毛刺显性数组**或**显性毛刺数组**（Naked Burred Subset 或 Burred Naked Subset）。

## 什么是毛刺？ <a href="#what-is-a-burr" id="what-is-a-burr"></a>

### 毛刺的概念 <a href="#concept-of-burr" id="concept-of-burr"></a>

前面我们提到了毛刺数组。这里我们要说一下什么是**毛刺**（Burr）。

毛刺本质上来说，其实并不是说这个数组本身，而指的是 `r9c1(1)` 这个多出来的部分。这很奇怪，明明是毛刺数组节点，但毛刺的概念指的却是另外一个连进来的节点。

毛刺从根本上讲，指的是影响结构形成的、多出来的那一坨部分。你可以类比于之前学到的鱼技巧。鱼的技巧里我们学到过一个术语，叫做鱼鳍。鱼鳍指的是影响鱼成立的、多出来的那一坨。那么对于链理论而言，毛刺这个概念就可以视为是鱼鳍的超集（或者说鱼鳍是毛刺的其中一种特殊情况，鱼鳍基本等于是在说，用于鱼结构的毛刺）。

### 毛刺和鱼鳍的区别 <a href="#difference-between-fin-and-burr" id="difference-between-fin-and-burr"></a>

之所以说“鱼鳍基本等于‘用在鱼里的毛刺’”，而不是说“鱼鳍就是鱼里的毛刺”，是因为从术语角度来说，他们是有区别的。

鱼鳍更侧重的是鱼鳍本身真假的讨论（鱼鳍的位置填，还是不填），然后取出两种情况均可造成的删数，作为技巧的结论；而毛刺一般不能这么看，它只能放在链里作为链的一部分。鱼鳍可以有多个，毛刺虽然也可以有多个，但是多个鱼鳍是看成整体讨论的；但是毛刺就不一样了。毛刺数组在链里一旦有多个，那么他们各自就是独立的节点信息了。

总之，毛刺这个术语一般只会用在链里。虽然不严谨，但是你可以勉强地认为，它就是鱼鳍，只不过鱼鳍上长了一根链，把它串在了里面。

## 毛刺隐性数组 <a href="#burred-hidden-subset" id="burred-hidden-subset"></a>

<figure><img src="/files/LcTTpKdQ9zC45UCiQ2rd" alt="" width="375"><figcaption><p>毛刺隐性数组链</p></figcaption></figure>

如图所示。这个链的写法如下：

```
3r46c1=(3-6)r7c1=(6-8)r7c3=78r45c3
```

可以看到，这里的数组不是显性的了，而是隐性的：整个 `c3` 里可以填 7 和 8 的位置只有 `r457c3` 三个单元格。当 `r7c3(8)` 为假的时候，7 和 8 只能填在 `r45c3` 之中，于是就成了一个隐性数对。就跟前面那个一样，这里我们把 `r45c3(78)` 看成一整个节点，就好比是在说 `r7c3 <> 8` 时，`r45c3(78)` 这个节点为真。

于是，链就成立了。删数也是一样，看两头节点的可删数的范围，取交集即可。这个地方稍微麻烦一些的是，`r45c3(78)` 是隐性数对，所以它的删数是 `r45c3` 里其他的候选数；那么对于链头 `r46c1(3)` 而言，它可以删除 `r45c3(3)`。所以，这个题的结论就是 `r45c3 <> 3` 了。

这次我们用的仍然是毛刺数组，只不过是隐性的，所以我们把这个称为**毛刺隐性数组**或**隐性毛刺数组**（Hidden Burred Subset 或 Burred Hidden Subset）。

## 毛刺数组节点为假的候选数分布情况 <a href="#distribution-of-candidates-in-burred-subset-node-when-false" id="distribution-of-candidates-in-burred-subset-node-when-false"></a>

我们刨根问底一下。

我们都知道，毛刺数组的节点为真时，就意味着数组就是成立的，于是我们就可以保证数组内部一定会填写这些数字。比如对于三数组 1、2、3 而言，数组为真就说的是 1、2、3 能恰当地安排在这三个单元格里，一个位置填一个数。那么，毛刺数组节点为假呢？

因为节点的真假性总是互斥的情况，所以节点为假自然指的就是“不满足成立状态的其他所有情况”。还是拿这个三数组举例的话，三数组为假就意味着里面填不成满足三数组的情况。什么时候可以呢？比如说隐性三数组的话，就是这里三个单元格填的是 1、3、4 或者别的什么，反正少了一些候选数状态、不足以使得 1、2、3 各一个的状态；那对于显性三数组而言，自然就是直接让毛刺的那部分成立，使得这个三数组始终填不成 1、2、3 各一个。别忘了这个时候毛刺三数组可不和显性三数组等价，因为它里面可能会有额外的候选数填入。

## 最后我们再看一个例子 <a href="#another-example" id="another-example"></a>

<figure><img src="/files/E8QtmZYcJvKOlUFm6k8d" alt="" width="375"><figcaption><p>同时用显性和隐性毛刺数组的例子</p></figcaption></figure>

如图所示。链表示如下：

```
38r23c6=8r6c6-8r6c8=8r5c9-8r3c9=56r3c49
```

这是一个链头是毛刺隐性数对，链尾是毛刺显性数对的特殊链，中间只用了数字 8 搭建了桥梁，让这两个毛刺数组能够连起来。

可问题是，这个链要想推理起来，起头就开始犯难了。既然这里是强链关系，那我们凭什么说这个地方，`r23c6(38)` 和 `r6c6(8)` 不同假呢？这个时候我们就得用到前面毛刺数组节点为假的假设模式了。当毛刺节点 `r23c6(38)` 为假时，意味着里面无论如何都不能让 3 和 8 的隐性数对成立，这也就意味着里面肯定不够一个填 3 一个填 8 的状态。

思考一下，3 和 8 的可能摆放。因为这是毛刺隐性数对，所以 3 和 8 对于 `c6` 而言，只能填在 `r236c6` 这三个单元格里。显然，3 只能填在上面，虽然我们说毛刺节点为假，但起码我们至少得保证数独规则要成立吧。这是我们的底线。所以 3 只有两处可填位置，自然需要满足。

那么，有问题的数字就只能是这个 8 了。那 8 能放的位置能让数组节点为假，自然就只能让 8 填在 `r6c6` 里。因为这是唯一一处可以让毛刺隐性数对不成立的位置，毕竟 3 在上面必须得填一个，那么另外一个位置不管是哪一个，只要填 8 就必定是会构成隐性数对的。所以，既要保证数组节点不成立，又要保证数独规则不违反，此时只能有 `r6c6(8)` 这个节点为真才可以。所以，这个强链关系就这么来的。

而后面的推理过程就全部和之前的一样了，这里就省略重复解释了。至于删数的话，反而比前面这个节点为假理解起来要简单。因为 `r3c6(56)` 可以同时被显性数对和隐性数对都删除掉，所以这两个删数是这个题的结论。

这里留一个问题。我们之前学到，链是可以逆向理解的，因为链的正反不影响结论的成立和链的成立。所以，如果我们要让这个毛刺显性数对节点作为链头的话，它为假应该指的是什么意思呢？我希望各位思考一下这个问题。

至此我们就把待定数组的内容全部介绍完了。之后我们将进入到新的内容里来。


# 待定唯一矩形链（AUR 链）

Almost Unique Rectangle Chain

今天我们继续来学习链理论。前面我们学到了纳入区块和数组作为链推导的一部分的做法，这次我们继续将唯一矩形纳入，看看它还能诞生什么新的推理过程。

## 待定唯一矩形里的强链关系 <a href="#strong-inference-in-almost-unique-rectangle" id="strong-inference-in-almost-unique-rectangle"></a>

<figure><img src="/files/UaC0wbPCKffXnXN4wpyS" alt="" width="375"><figcaption><p>强链关系例子</p></figcaption></figure>

如图所示。这个链的表示如下：

```
8r2c3=3r2c23-3r2c4=6r9c4-6r9c9=8r59c9
```

我们先看最开始这个强链关系。`8r2c3=3r2c23` 是怎么来的呢？我们可以从图上看到，这是一个用到数字 5 和 9 的唯一矩形，不过 `r2c2` 缺了一个数 9，这并不要紧，因为唯一矩形缺数字是不影响推理的，这一点之前已经说过了。

当 `r2c3(8)` 为假时，唯一矩形必须要求 `r2c23(3)` 至少有一个 3 为真，否则四个单元格仅剩下 5 和 9 引发唯一矩形的矛盾。所以，这个强链是有道理的；当然，你也可以使用第二定义去理解，即证明节点 `r2c3(8)` 和 `r2c23(3)` 不同假。

总之我们得到了 `r2c23(3)` 里必须有一个 3 为真，即 3 在这两个单元格将会形成区块节点，其区块节点为真。于是，`r2c4(3)` 就为假了，因为这个候选数位于区块节点可排除 3 的范围内。后面就和之前待定数组的推理过程一样了，这里就不展开重复说明了。

我们可以看到，这个题里用到了 3 和 8 形成强链关系的用法，而证明这个用法的方式是通过唯一矩形来得到。我们把借用唯一矩形推理的链称为**待定唯一矩形链**（Almost Unique Rectangle Chain，简称 AUR Chain），而把这个题里用到的唯一矩形 `r29c23(59)` 称为**待定唯一矩形**（Almost Unique Rectangle，简称 AUR）。和待定数组一样，待定唯一矩形也是无法单独拿出去推理的，它必须参与到链里作为推理的一部分才可以发挥作用。

下面我们再来看一个例子。

<figure><img src="/files/Drgqjc2Ln6AVNh5e9wUR" alt="" width="375"><figcaption><p>另一个强链关系的例子</p></figcaption></figure>

如图所示。这个题就自己看了。不过要注意的是，因为待定唯一矩形的特殊性，强链关系不一定非得发生在同一个区域里。比如这个题它就可以连接两个完全行列宫不相关的地方。

## 还是强链关系，但是线连到外面去了 <a href="#strong-inference-with-one-side-external-link" id="strong-inference-with-one-side-external-link"></a>

<figure><img src="/files/xjd4eQuTg2Ego3LyVGOF" alt="" width="375"><figcaption><p>强链关系，但是一端连出去了</p></figcaption></figure>

如图所示。这个的表示如下：

```
3r5c1=3r7c1-3r78c2=5r5c6
```

可以看到这个例子非常的“异类”。尤其是 `3r78c2=5r5c6` 这个强链关系，突出一个离奇。

实际上这个地方我们要借助一下唯一矩形里共轭对的概念。因为不太方便用第一定义去理解，这里我们还要用第二定义“不同假”来理解这个，会稍微方便一些。

如果我们同时让 `r78c2(3)` 和 `r5c6(5)` 同假，则 `r78c2` 只剩下了 5 和 7（区块节点为假则数字全部消失，这我不用过多重复说明了吧）。那 `r78c6` 呢？此时因为外侧的这个 5 不存在了之后，观察 `c6`，我们可以发现数字 7 原本就是共轭对，而数字 5 因为我们把外部 `r5c6(5)` 设为假了，所以它也没了，此时 5 也变为了共轭对。

两个数都是共轭对意味着什么？隐性数对嘛。这两个数都是共轭对，还都在同样的两个格子里，这不就意味着一个是 5 而另一个一定是 7 么。所以，我们就得到了 5 和 7 只能填进去的效果。结合前面我们假设了 `r78c2(3)` 为假的内容，我们就可以得到，`r78c26` 将只会剩下 5 和 7，导致唯一矩形的矛盾。

因此，这两个节点不能同假，故形成了强链关系。有了这一点后，这个链就连起来了。

这便是强链关系的第二种情况，一边是连在矩形结构的内部（用到矩形四个格子的其中一些格子），一边则是连在矩形外部的。

下面我们再来看两个例子。这个例子也希望你自己看。

<figure><img src="/files/lrTsxMeMHYxbSRvQ9sry" alt="" width="375"><figcaption><p>一头在外面一头在里面的另外一个例子</p></figcaption></figure>

这个例子的链尾非常神奇，它是一个看起来只会出现在待定数组里的、四个候选数在平时做题压根就不会考虑成为节点的节点，但被我们直接拿出来用了。

<figure><img src="/files/SEqX7gMrdzHt3jLzUcDb" alt="" width="375"><figcaption><p>连用两个待定唯一矩形的链</p></figcaption></figure>

再来看一个这个例子。这个例子用了两个待定唯一矩形。这两个待定唯一矩形带来的强链关系均来自于前面这两种情况。可以拿来学习学习。

## 依旧是强链关系，但是线完全在外面 <a href="#strong-inference-with-two-sides-external-link" id="strong-inference-with-two-sides-external-link"></a>

我们再来看一个奇葩的例子。

<figure><img src="/files/pJs3UgJtTQYBA3T0qQqo" alt="" width="375"><figcaption><p>强链两头都在矩形外面的情况</p></figcaption></figure>

如图所示。这个链的写法如下：

```
4r78c9=9r8c9-9r1c9=4r1c79|r2c8
```

这个例子是目前我们链理论里接触过的最离谱的例子。当然，讲完你就明白了，它只是看着离谱。

头部这个强链关系是两个 4 和 9 的强链关系。这看起来非常像是一个待定数组形成的强链关系，但仔细观察可以发现它其实并不是：这两个单元格除了 4 和 9 外还包含了 5 和 8 两个无关的候选数。如果按照纯正的待定数组来看的话，这里最多就只应该有一个多出来的候选数，但这里有两个无关的候选数。或者说，我们要让待定数组形成，我们大不了就去这个列或者宫里找到额外的一个或一组单元格，使得待定数组成立。可怎么找都找不到。所以，使用待定数组的思路是行不通的。那这是怎么形成的呢？

实际上这是待定唯一矩形得来的强链关系。前面我们提到，待定唯一矩形可以让其中一端脱离唯一矩形结构的四个单元格，把节点画在结构的外面去。这个例子则更离谱一些，两头都画在了外面。

原理是这样的。首先，`r12c5` 是一个关于 4 和 9 的显性数对，而要使得 `r12c9` 也只能含 4 和 9，就必须把 `c9` 里其余的 4 和 9 全给干掉。可以发现，除了这两个单元格有 4 和 9 外，就只剩下 `r78c9` 这两个单元格了。假设 `r78c9(4)` 和 `r8c9(9)` 同假，则 4 和 9 在 `c9` 将只能填入到 `r12c9` 里，于是构成了之前说到的 4 和 9 同时都是共轭对在同样单元格的情况。

同样的单元格又是共轭对就意味着这两个单元格是隐性数对。而结合前面说的 `r12c5`，四个单元格就会直接形成唯一矩形的矛盾形式。因此，头部的强链关系就这么得到了。

后面的强链关系则是待定数组得到的，这里就不赘述了。

我们再来看一个例子，也挺抽象的。

<figure><img src="/files/LnGMD8oGwuEJjJiWvCLV" alt="" width="375"><figcaption><p>另一个两头都在结构外面的强链的例子</p></figcaption></figure>

如图所示。这个就自己看了。表达如下：

```
8r9c8=9r5c8-9r4c8=8r79c8
```

看着就挺抽象的。

## 待定唯一矩形里的弱链关系 <a href="#weak-inference-in-almost-unique-rectangle" id="weak-inference-in-almost-unique-rectangle"></a>

待定唯一矩形是否可以构造弱链关系呢？实际上也是可以的，只是不太常见。下面我们就来看一个例子。

<figure><img src="/files/NDDHAvDzEyrdcrIkTwtW" alt="" width="375"><figcaption><p>弱链关系的例子</p></figcaption></figure>

如图所示。这个例子的表示如下：

```
3r9c1=3r7c3-3r7c78=(3-4)r89c7=4r3c7-4r3c9=5r1c9-(5=36)r2c78
```

可以看到，这个题用到的东西还挺多的，一个待定数组，一个毛刺数组，一个待定唯一矩形，以及若干区块节点。虽然绕来绕去只能删一个数，但是它利用到的一个待定唯一矩形的弱链关系就是这里的 `(3-4)r89c7` 了。因为左侧 `r89c5` 两个单元格仅有 3 和 4，所以一定是显性数对；而对于右边这两个区块节点，如果这两个区块节点同为真，则意味着两个单元格必须一个是 3 一个是 4，则一定矛盾。

虽然这个思路非常新颖，但是奈何它用到的是弱链关系，因此出现频率非常低，平时做题之中也很难遇到它。对于这个题来说，它也能用更短且不用待定唯一矩形结构就可以绕过这个删数。总之就是在做题的时候很难遇到。

我们再来看一个例子。

<figure><img src="/files/t7o6jsZXinVb75CEDpKq" alt="" width="375"><figcaption><p>另一个用弱链关系的例子</p></figcaption></figure>

如图所示。这个例子稍微看着有点别扭。它的写法如下：

```
9r78c6=9r23c6-7r3c6=9r1c45|r2c4|r3c56
```

中间的 `9r23c6-7r3c5` 用的是这个待定唯一矩形的弱链关系，最后这个强链关系产生自待定数组。因为头尾分别是 `r23c6(9)` 和 `{r1c45, r2c4, r3c56}(9)`，所以交集的删数是 `r2c6 <> 9`。


# 待定可规避矩形链（AAR 链）

Almost Avoidable Rectangle Chain

今天来看一篇短小的内容。因为这种用法并不算多，但也挺新奇的。

## 待定可规避矩形的弱链关系 <a href="#weak-inference-in-almost-avoidable-rectangle" id="weak-inference-in-almost-avoidable-rectangle"></a>

<figure><img src="/files/Ov1M3j2w5p88Mqg46tgV" alt="" width="375"><figcaption><p>弱链关系</p></figcaption></figure>

如图所示。链的写法如下：

```
9r4c6=9r4c2-9r6c7=9r5c8
```

其实还算一个比较简单的链，只有两个强链关系。不过这个链里用到的弱链关系是直接连接了完全不相关的候选数 9。这个其实是可规避矩形的功劳：如果 `r4c2` 和 `r6c7` 都填 9，则四个单元格 `r46c27` 将构成关于 8 和 9 的可规避矩形的矛盾情况。所以这两个 9 是不同真的。不同真即为弱链关系，所以我们可以直接串到链里使用。

我们把这个图里 `r46c27` 四个单元格的候选数 8 和 9 这种结构称为**待定可规避矩形**（Almost Avoidable Rectangle，简称 AAR）；而把使用了待定可规避矩形的链就称为**待定可规避矩形链**（Almost Avoidable Rectangle Chain，简称 AAR Chain）。

因为待定可规避矩形出现频次极低，在实战里也较少应用，因此例子并不多。

## 待定可规避矩形的强链关系 <a href="#strong-inference-in-almost-avoidable-rectangle" id="strong-inference-in-almost-avoidable-rectangle"></a>

<figure><img src="/files/QpQOWGxWz4IZwuRHl4gz" alt="" width="375"><figcaption><p>强链关系</p></figcaption></figure>

如图所示。这甚至还是刚才那个题。链的写法如下：

```
5r6c7=4r4c2-4r1c2=5r23c1
```

这次我们用一下里面的强链关系。刚才我们不是用到了弱链关系不同真的逻辑吗？这次我们不看这两个 9 的关系。我们发现，这两个空格上都还包含一个多出来的候选数。显然，这两个候选数是不同假的。同假就意味着两个单元格变为唯一余数，则必须填 9 致使出现矛盾。

然后，我们利用这个强链就可以得到这个题里的删数结论了。

## 拓展删数 <a href="#extended-elimination" id="extended-elimination"></a>

我们继续来看强链关系，不过我们换一个用法。

<figure><img src="/files/Tk2v6CSjdLUNTH6zKKv2" alt="" width="375"><figcaption><p>删数方式的拓展</p></figcaption></figure>

如图所示。这个题的写法如下：

```
5r1c6=8r1c8-(8=3)r2c9
```

这个题的链看起来其实倒还好，但是删数选择的单元格却比较奇怪：`r1c6(5)`。

按照链的头尾删数取交集的逻辑来看，链头确实可以删掉这个 5，但链尾不是 3 么？怎么还能删这个 5？本质原因在于这个 5 是可规避矩形这个逻辑才能产生的删数。如果链尾 `r2c9(3)` 为真，则根据可规避矩形的逻辑，我们需要去掉候选数 `r2c6(5)`。否则，让它填入就会直接造成矛盾。

这是我们第一次接触到头尾删数取交集不能直接使用链的方式得到的例子。这种删数方式并不多见，但他们偶尔也会在链里遇到，所以希望你能掌握。


# 环

Loop

欢迎来到新的内容。链理论除了前面学到的这些用法外，还有一些额外的拓展思想。

如果你充分了解了前面的内容后，我们将开始学习链理论的第一个拓展思想：**环**（Loop）。


# 环的基本推理

Reasoning of Loop

什么是环呢？我们先来看一个例子。

## 连续环（Continuous Nice Loop） <a href="#continuous-nice-loop" id="continuous-nice-loop"></a>

<figure><img src="/files/atCAUqZ5o8dnWY0bmzaq" alt="" width="375"><figcaption><p>连续环</p></figcaption></figure>

如图所示。这是一个普通得不能再普通的环。红色的全是删数（一共有 11 个），不过我们得一点一点来学。这个环的写法如下：

```
(8=7)r1c2-7r3c1=(7-1)r6c1=(1-2)r6c2=2r6c5-(2=3)r5c4-(3=5)r7c4-5r7c6=(5-8)r4c6=8r1c6-8r1c2
```

我们发现，这个链的强弱关系完全交替进行，但我们绕着环看一整圈都未必能发现起点在哪里。既然如此，我们为了强制能看成链，我们任意拆掉其中一个弱链关系，把它断开，因为断开的是弱链关系，所以头尾的强链关系得以保留，链仍然可以成立。

就这么干。我们发现，比如我们断开 `8r1c2-8r1c6` 这个弱链关系，那么这个环就会从 `r1c2(8)` 开始往下走，然后走了一条很长的链回到 `r1c6(8)` 结束。此时，因为链是成立的，所以删数应该看的是头尾的交集。链头是 `r1c2(8)`，而链尾是 `r1c6(8)`。他们同在一个行上（这不废话吗？）。所以，同一行上的其余位置的候选数 8 理应是可以去掉的。这样我们就得到了 `r1c9 <> 8` 的结论。

看起来，这个环路因为强弱是完全交替的，所以看起来似乎断开哪一个弱链关系都不会影响到链的成立。那么我们把所有弱链每一个都断开一下，然后去找删数。我们就可以发现，把他们每一个断开后找到的删数序列全部整理出来，便是这个图里画出来的所有红色的删数。

这里要补充一点：千万别忘了单元格里的删数。比如例子里 `r6c1(3)` 可以删，它删数的由来是断开了 `(7-1)r6c1` 这个弱链关系得到的。而因为链的头尾均在同一个单元格，所以这个单元格里必须填一个 1 或 7，所以别的候选数都填不进去。

我们把这个技巧称为**连续环**（Continuous Nice Loop，简称 CNL），一般也简称为环。

实际上，环的极限远不止这样。下面我们来看一个例子，一共有 17 个删数。

<figure><img src="/files/ssW0o4AB63XwaDyRCv7P" alt="" width="375"><figcaption><p>删 17 个数的连续环</p></figcaption></figure>

你可以自己看看这个例子。虽然看着挺复杂的，但是好在它其实就是多用了几次强弱链关系的编排方式而已，只要链能看明白，环肯定就能看明白。

## 环的一些特征 <a href="#features-of-loop" id="features-of-loop"></a>

从前面的例子可以看出来，环具有如下的一些特征：

* 任意弱链关系都可以拆掉，剩下的都将构成一个链；
* 环里的所有弱链关系都可以转化为强链关系；
* 环的节点数和强弱链关系个数都一定是偶数；
* 环里任意相邻两个节点的真假性互斥；
* 环只有两种填数状态；
* 任意节点都可以作为整个环的开头。

这第一个说法是废话，因为我们利用的就是这个特征在解释环的删数原理，所以我们就不解释了。不过这里我们可以补充一下。因为环的所有弱链关系均可断开并使用链的删数规则找删数，那么在删数完成后，你再去看这个弱链关系你就会发现，弱链此时会变为强链关系，因为这两个节点不存在其他位置摆放，直接就使得了不同假的状态的成立，这便是第二点“可转化为强链关系”的真正原因。所以，这一句话倒也不完全是废话。

### 长度和节点数为偶数 <a href="#length-of-loop-is-an-even-number" id="length-of-loop-is-an-even-number"></a>

这个稍加思索就可以得到。因为强弱链需要交替成环，那么强弱链的关系数量一定是一样多的。既然是一样多的，假定我们有 $$n$$ 个强链关系和弱链关系，那么总数量就是 $$n + n = 2n$$ 个。这肯定是一个偶数。

而在环里，因为不存在独立的节点，所以一个节点引出一个强链关系或一个弱链关系，自然也得是 $$2n$$ 个。所以节点数也是偶数。

### 相邻节点真假性互斥 <a href="#exclusive-state-in-adjacent-node" id="exclusive-state-in-adjacent-node"></a>

从客观角度来说，一个节点的真假性一共就只有两种：真或假。那么对于两个节点而言，就会有四种情况：真和真、真和假、假和真、假和假。

对于强链关系而言，两个节点必须不同假，因此四个组合里排除掉“假和假”这个情况，还剩下三种满足题意。而它俩能同真吗？看起来可以，但实际上不能。因为节点数量是偶数个，所以只有可能真假性交替出现才能导致环的结构稳定。如果某相邻两个强链关系节点是同真的状态，则这个环就没办法顺次成环状态推导了，毕竟，链理论要求我们按填和不填交替推理，自然在环里就不可能存在相邻节点同真的状态。这一点和普通的链还是不一样的。

所以，两个节点只可能一真一假，即互斥的状态。

### 只有两种填数状态 <a href="#only-two-states-of-loop" id="only-two-states-of-loop"></a>

既然我们知道相邻节点的填数状态必然互斥，那么整个环又要保证真假性交替出现，自然就只有两种填数可能。我们随意选一个节点开始，设它为假，那么真假性交替起来之后，就会得到一个序列：

* 假、真、假、真、假、真、……、真

如果我们再设它为真，就会得到完全相反的序列：

* 真、假、真、假、真、假、……、假

因为是偶数个节点，所以头尾两个节点真假性必然也是相反的，因为它俩客观来说是在环里是相邻的节点。于是，环就只有这两种填法。

### 任意节点都可作为环的头 <a href="#any-node-can-be-head" id="any-node-can-be-head"></a>

然后是最后一条。这一条稍微麻烦一些。它需要链的双向性来得到证明。

我们先来回顾一下链的双向性。由于链使用的强弱链关系在定义上是方向对称的。所谓方向对称，就是说你正向和逆向都可以使用同一个规则进行推导。比如强链关系，能从 $$A$$ 到 $$B$$ 就一定也能从 $$B$$ 到 $$A$$。正是因为这个原因，再加上链自身强弱关系的摆放也是对称的（强 - 弱 - 强 - 弱 - 强等等），所以链自身也具备可以逆向推理的过程，即正向的链可以进行正常推导，则逆向的也可以推导。

那么，对于环而言，所有同一个真假性的节点一组，就会把节点分为两组。环的推理是不知道从哪里开始的，那么我们不妨就让所有真假性为假的这一组节点作为链头。这样我们按照链的正常方向就可以得到一条完整的环。那么对于真假性设为真的这一组节点呢？我们只需要把环给完全反个向，此时设为真的节点就会变为设为假。

我想你估计可以理解它，但我还是把这句话给解释一下。因为按照链的基本规则，我们必须要以强链起头，所以设为真的这一组是没办法按预设的那个方向推导的（它起步就为真，但链的起步必须是假）。那么反向之后，强链关系毕竟不会受到反向的影响，所以强链关系依旧成立。比如说我们有 $$A$$ 和 $$B$$ 两个节点是强链关系。那么原本我们假设的是 $$A$$ 节点为假和 $$B$$ 节点为真，现在我们反向了之后，$$B$$ 节点就会变为强链的开端，而 $$A$$ 节点此时反而放在了 $$B$$ 的后面。而强链关系是开端的一边设为假的，所以变为 $$B$$ 节点开始时，它理应设为假。这就是我刚才说为啥原本设为真的会变为假的原因。当然，这里你也可以使用逆否命题来理解：$$\lnot A \to B$$ 的逆否命题是 $$\lnot B \to A$$，这个更靠近数学说法一些。

随便你怎么理解吧，反正它的真假性会因为反向后变为假，所以理应所有节点都是有假这个状态的，所以他们都可以作为环的开头而存在。

所以，环是没有逻辑上的“链头”的，任意一个节点都可以开头，只是说它最多会取决于你选取的环的方向罢了。

## 鱼环（Fishy Cycle） <a href="#fishy-cycle" id="fishy-cycle"></a>

为了技巧的完整性，这里我们再补充一个技巧。

<figure><img src="/files/ZgcoaOv7V5xmB4jJfRbj" alt="" width="375"><figcaption><p>鱼环</p></figcaption></figure>

如图所示。这是一个环，不过环内只用了一种数字。我们把这个称为**鱼环**（Fishy Cycle）或者**同数环**（X-Cycle）。还记得鱼吗？鱼这个技巧就只用同一种数字，所以这个环是想说明它跟鱼一样只用一种数字。

我们再来看一个**区块鱼环**（Grouped Fishy Cycle），或者叫**同数区块环**或**区块同数环**（Grouped X-Cycle）。

<figure><img src="/files/pA8FJfnHrjvHfFmns9b6" alt="" width="375"><figcaption><p>区块鱼环</p></figcaption></figure>

如图所示。这个就稍微带了个区块罢了。

## 双值格环（XY-Cycle） <a href="#xy-cycle" id="xy-cycle"></a>

下面我们再来看一个例子。

<figure><img src="/files/aQ0F4bMhjuanzqUpFjWT" alt="" width="375"><figcaption><p>双值格环</p></figcaption></figure>

如图所示。这是一个**双值格环**（XY-Cycle），即双值格链的基础上成环，所有强链均发生在同一个单元格内。

## 其他问题 <a href="#other-questions" id="other-questions"></a>

### 英文名里我们应该用 Loop 还是 Cycle？ <a href="#loop-or-cycle" id="loop-or-cycle"></a>

可能你看完了整篇内容会发现一个问题。文章开始那里还在用 loop 来表示环，怎么到这里新补充的两个技巧的技巧名怎么用的是 cycle？这到底应该用哪一个单词？

这个其实说来话长。非要强行概括的话，你可以认为是历史因素。实际上，loop 和 cycle 均可表示环，也都没有问题，甚至还可以用 ring 来表示环。这三个单词在技巧名称上使用均不会造成问题，比如你说 X-Loop 而不是 X-Cycle，也并不会有问题。但是，一般是因为叫某个说法的人多了，所以就约定俗成使用了这个说法。

本来名称这个东西就没有什么对错，你喜欢你叫什么都行。但是，按照学习的角度去看的话，因为更多人叫它 X-Cycle（用 cycle）、XY-Cycle（用 cycle）、Continuous Nice Loop（用 loop），所以我们就采用更多人的叫法。非要说区别的话，你可以认为是不同的人群导致的倾向性。比如三款不同的数独分析软件 HoDoKu、Sudoku Explainer 和 XSudo 里，HoDoKu 用 loop 更多，Sudoku Explainer 用 cycle 更多，而 XSudo 用 ring 更多。

### 环的尤里卡记法

对于环而言，尤里卡记号并未拥有一个严格的限制，因为强弱链交替的缘故，链尾是可以用弱链连回链头的。

本教程从约定俗成的角度出发，仍然按照链头强链关系起步的逻辑进行描述，直到到最后一个节点时，比正常的链多一个弱链关系表示它连回链头的过程，这样的方式用来区分链和环。例如最开始的例子里，开头是 `(8=7)r1c2`，最后是 `8r1c6-8r1c2`，描述了连回链头 `r1c2(8)` 这个节点。


# 数组、鱼和欠一数对的环视角

Loop Views of Subset, Fish & Almost Locked Candidates

之前我们学习了环的推理过程，那么接下来我们来看看一些之前学过的数独技巧，它们都有什么样子的环的视角。

本篇的内容不一定非得需要单独学习，因为他们在实战里并不会用到，但为了扩充你对环的理解思维和方式，所以临时添加了这篇内容。

## 数组 <a href="#subset" id="subset"></a>

最熟悉的就是数组了。实际上，数组的双值格其实就对应了链的强链关系；而弱链关系则是两个相同数字之间的连接。我们来看一个例子。

<figure><img src="/files/ppylZ6juy5iydzgYuzkI" alt="" width="375"><figcaption><p>显性数对的环视角</p></figcaption></figure>

如图所示。显性数组如果要用环的方式画出来就得这么画。

尤其需要强调的是，环因为强链关系的缘故，数组暂时只有双值格的数组能转化为环的视角。像是三数组那种单元格是三值格而不是双值格的情况，因为有三种数字的存在，所以是不能转换的。

不过，双值格三数组是可以的。比如这个例子。

<figure><img src="/files/Sro7FvzmaxPETmPfwtaH" alt="" width="375"><figcaption><p>双值格显性三数组的环视角</p></figcaption></figure>

如图所示。

另外，隐性数组也是可以的，不过我们需要把强链关系从单元格内调到数字之间，就好比是把刚才显性数对里的那个弱链的位置更换为强链关系即可。

<figure><img src="/files/3bnm51x3Bu7q9lqlrGJy" alt="" width="375"><figcaption><p>隐性数对的环视角</p></figcaption></figure>

## 鱼 <a href="#fish" id="fish"></a>

是的。鱼也是有环的视角的。我们先来看二阶鱼。

<figure><img src="/files/bnDVlOID9WlYkuoih17W" alt="" width="375"><figcaption><p>二阶鱼的环视角</p></figcaption></figure>

如图所示。我们只需要把 `r37` 这两个作为假设排列的区域改造为强链关系、然后用弱链把四个候选数连起来即可。

和前面数组的要求类似，鱼也需要要求假设排列的地方只能有两处才能转换为强链关系。如果可以的话，更高规格的鱼也是可以转的，比如这个三阶鱼的例子。

<figure><img src="/files/44Gmryrv4i4IOd2Q9QF4" alt="" width="375"><figcaption><p>三阶鱼的环视角</p></figcaption></figure>

如图所示。

## 欠一数对 <a href="#almost-locked-candidates" id="almost-locked-candidates"></a>

还能转为环视角的技巧还有一个，欠一数对。这似乎很意外，但我们来看一个例子就知道了。

<figure><img src="/files/7hUq0KGoNoEguuEmHgUO" alt="" width="375"><figcaption><p>欠一数对的环视角</p></figcaption></figure>

如图所示。这是一个欠一数对（的环的画法）。我们刚才大概看出了环视角下强链弱链关系在数组和鱼里的体现，所以对于欠一数对而言，它的体现理应也可以等价改为环里的强弱链关系。比如这个题里，假设我们选取 `r6c7` 是隐性的一边，而 `r9c9` 是显性的一边，那么我们需要依赖 `c7` 上 2 和 8 的位置关系（此时两个数都是共轭对），便会得到这样一个由 6 个节点构成的环。删数是所有弱链的位置可以删的地方，不过不巧的是这个题就只有 `r9c8 <> 8` 这一个删数。

这便是欠一数对的环的画法。

我相信，三个技巧足以阐述我想表达的东西。下一节我们继续探讨环的使用，不过我们想给各位拓展一些技巧构造，一些不方便放在前面一个大板块里的技巧，用环表明它的使用。


# 区块环

Grouped Loop

下面我们继续来看一些环里带有区块的情况。

## 区块环的删数逻辑 <a href="#elimination-rule-on-grouped-continuous-nice-loop" id="elimination-rule-on-grouped-continuous-nice-loop"></a>

我们先来学习区块环的形成和删数。

<figure><img src="/files/jwq0ekNdIdVbWIBuxeHZ" alt="" width="375"><figcaption><p>区块环例子</p></figcaption></figure>

如图所示，这个环的写法如下：

```
(6=8)r1c4-8r79c4=(8-5)r8c6=5r123c6-(5=6)r1c5-6r1c4
```

这是一个很简单的环。而按照区块链的删数逻辑来看的话，我们照样使用环的先拆弱链关系然后找删数的方式来看，这个题的删数就可以完整找出，也不存在特殊情况：

* `6r1c4-6r1c5` 可以删除 `r1` 和 `b2` 里其余位置的 6；
* `8r1c4-8r79c4` 可以删除 `c4` 里其余位置的 8；
* `(8-5)r8c6` 可以删除 `r8c6` 里除了 5 和 8 外的其余候选数；
* `5r123c6-5r1c5` 可以删除 `b2` 里其余位置的 5。

整个环一共有四个弱链关系，把他们的删数全部排列起来，一共有 11 个删数。

我们把带有区块节点的环称为**区块连续环**（Grouped Continuous Nice Loop，简称 GCNL）。可以看出，区块连续环的本质还是和普通的连续环完全一样，按弱链删数即可。只是说因为有区块的存在，删数的区域、位置可能都会受到限制。这似乎还比较容易，下面我们来看一些复杂的情况。

## 待定数组的环 <a href="#almost-locked-set-loop" id="almost-locked-set-loop"></a>

<figure><img src="/files/NB1o23PEHbaj1hGsD8Ql" alt="" width="375"><figcaption><p>ALS-XZ 环</p></figcaption></figure>

如图所示。这是一个环，它的写法如下：

```
4r3c2=6r2c23-6r2c4=4r3c4-4r3c2
```

我们随意拆掉一个弱链关系就可以发现，它其实是普通的 ALS-XZ。

> 这技巧名实在是太长了，我实在是不想写它的中文名，还是用英文称呼吧。

但因为弱链关系摆放的特殊性，所以弱链又能连进去，形成区块连续环的模式。

那么删数怎么删呢？如果我们直接按照普通连续环的逻辑进行删数，这个题就只会有一个删数：`r2c5 <> 6`。但很显然，这个题长这么特殊肯定不止删这一个位置。

我们仔细分析一下待定数组在环里的效果。之前我们学到环的时候我们知道，环内相邻两个节点的真假性一定是相反的，这意味着，对于这个环而言，四个节点只有可能有这两种情况：

* `r2c23(6)` 和 `r3c4(4)` 两个节点为真；
* `r2c4(6)` 和 `r3c2(4)` 两个节点为真。

我们之前说过，待定数组的强链关系的形成需要依赖的是两种不同数字。比如这个例子里 `r23c23` 里是所有数字 4 的位置和所有数字 6 的位置，他们两组单元格构成节点，然后他们形成强链关系。因为待定数组的数字种类数是会比单元格数量多一个单位量的，所以我们可以利用这一点来分析这个待定数组。

我们再回到环的这两种填法状态来看下。为了方便描述，我把待定数组的数字分为三组。拿 `r23c23` 这个待定数组举例的话：

* 第一组数字 $$A$$ 里只包含一个数字 6；
* 第二组数字 $$B$$ 里只包含一个数字 4；
* 第三组数字 $$C$$ 则是这个待定数组里的其余数字。

因为环的特征，显然 $$A$$ 和 $$B$$ 的真假性互斥，所以它俩只会有一个是为真的。而按数字分组的话，$$C$$ 这一组里现在只会有 3 种数字（一共有 5 种数字，而 $$A$$ 和 $$B$$ 因为要形成强链关系用掉了俩，所以还剩下 3 种）。而既然 $$A$$ 和 $$B$$ 是互斥的，所以能纳入到待定数组里填入的只有一种新的数字；算上 $$C$$ 这一组 3 种数字，刚好有 4 种数字会参与出现在这个环里；而刚好 `r23c23` 这个待定数组只有 4 个单元格，因此此时在环里，它会退化为一个标准的显性四数组结构，只是此时我们并不知晓 $$A$$ 还是 $$B$$ 究竟是哪一个在其中为真。但是，我们知道的是，肯定 $$C$$ 里的所有数字都是会出现的。

所以，这个题里多出来的很多删数来自于待定数组退化为数组的删数；而删数的数字来源都是从 $$C$$ 这一组里拿出来的。比如这个例子的 `r23c23` 里 $$C$$ 这一组只有 1、7、8 三种数，所以，`r1c123(178)` 的删数全部来自于这个待定数组。哦对，别漏了下面 `r6c2(1)`（因为待定数组里的 1 只出现在 `r23c2` 里，所以当数字 1 一定为真时，数字 1 就变为了区块来删数）。

这是 `r23c23` 这一边。然后还有一个待定数组是 `r23c4` 这里。对于这个待定数组而言 $$C$$ 这一组只有一个数字 7，所以删数就只删数字 7 作为区块的时候的删数。

最后把两组删数放到一起，便构成了这个题的所有删数。数数看，一共有 18 个删数呢！

这里我们补充一个之前没有提及的术语。在 ALS-XZ、ALS-XY-Wing 和 ALS-W-Wing 这种只使用待定数组构成的强链关系的技巧里，我们把其中弱链连接的两种数字称为**严格共享候选数**（Restricted Common Candidate，简称 RCC）。一般而言，对于 ALS-XZ 技巧只会有一个严格共享候选数的，但是对于它的环来说（比如这个例子里就是 ALS-XZ 的环），它就有两个严格共享候选数 4 和 6。

从这个术语角度来说，ALS-XZ 也有两种情况：

* **单严格共享候选数待定数组 XZ 逻辑**（Singly-Linked Almost Locked Set XZ Rule）
* **双严格共享候选数待定数组 XZ 逻辑**（Doubly-Linked Almost Locked Set XZ Rule）

因为术语足够长，所以这促成了这个技巧成为数独技巧体系里名称最长的数独技巧。

> 这个术语早期是在定义待定数组体系架构时才产生的，主要还是在于表示删数规则的时候才可能会派上用场；但现如今待定数组的体系比较庞大，而待定数组链也不再只是纯正的只用待定数组构成强链关系来构成一条完整的链了，所以渐渐地，这个术语就比较少用到了。所以之前教程内容并未单独针对这个术语进行说明。

下面我们再来看一个例子，也是 ALS-XZ 的环。

<figure><img src="/files/mRsfn2Adpqm74trhcfkL" alt="" width="375"><figcaption><p>另一个 ALS-XZ 的环</p></figcaption></figure>

如图所示。这个技巧的删数就自己看了。

下面我们来看一个普通的、带有待定数组的连续环。

<figure><img src="/files/b4ONiOvuByNX1iOR1FTp" alt="" width="375"><figcaption><p>带待定数组的连续环</p></figcaption></figure>

如图所示。环的写法如下：

```
1r2c1=4r8c1-4r8c4=1r7c4-1r3c4=1r2c6-1r2c1
```

和之前从 ALS-XZ 环里学到的删数方式完全一样，只是这个例子除了用待定数组构成强链关系外，也有普通的强链关系。

我们再来看一个例子，不过就自己看了。

<figure><img src="/files/NvzxTf8fqMJcIQiIYsSi" alt="" width="375"><figcaption><p>另外一个待定数组环</p></figcaption></figure>

如图所示。

## 待定唯一矩形的环 <a href="#almost-unique-rectangle-loop" id="almost-unique-rectangle-loop"></a>

我想我已经充分表示了我想说的内容。下面我们来看待定唯一矩形的环。

待定唯一矩形的环，要找它的额外删数就需要一定的穷举了。这和待定数组不同，待定数组虽然证明过程较为复杂，但结论是可以直接背下来，下回照着用的；但待定唯一矩形因为强链弱链关系的类型比较多，所以会麻烦不少。如果纯凭肉眼是看不到这个删数的，它需要一点“技巧”。

### 待定唯一矩形内部的强链关系 <a href="#internal-strong-inference" id="internal-strong-inference"></a>

<figure><img src="/files/AMcWHjKyohhMutYLaDFT" alt="" width="375"><figcaption><p>待定唯一矩形的环</p></figcaption></figure>

如图所示。环的写法如下：

```
2r1c5=4r2c2-4r9c2=2r9c5-2r1c5
```

看起来其实并不难，用了两个强链关系一个产生自待定数组，另外一个就是待定唯一矩形了。这个环的删数有 4 个，其中 `r3c2(4)` 和 `r9c1(3)` 都不难理解，一个是弱链直接删，一个则是用待定数组来删。那么，`r2c4(89)` 是怎么删的呢？

我们穷举一下两个情况。

<figure><img src="/files/RAV1J0dzXFpwhpng6ntF" alt=""><figcaption><p>尝试填充两个节点的两种情况</p></figcaption></figure>

如图所示。因为环内相邻节点一定是互斥的，因此我们干脆就两边都看一下。如果 `r1c5(2)` 为真，则是左边这个图；而如果 `r2c2(4)` 为真，则是右边这个图。说说图是什么意思。对于左图而言，因为 `r1c5(2)` 为真，所以 `r2c2(4)` 就只能为假，于是在这个情况下，`r12c2` 和 `r2c25` 则会形成关于 8 和 9 的显性数对。删数范围则是橙色标记的所有单元格（当然，原本唯一矩形的格子不算哈）；右图也是如此。

可以看到，这两种情况下，都能覆盖的地方有 `r1c3` 和 `r2c4` 两个单元格，所以，这个环包含 `r2c4(89)` 这两个候选数。

所以，唯一矩形的删数模式是看两个情况产生的显性数对所构成的删数交集。

我们再来看一个例子。

<figure><img src="/files/Uxt6fiNpzMX9SL9P1c1a" alt="" width="375"><figcaption><p>另外一个例子</p></figcaption></figure>

如图所示。这个仍旧是刚才那种强链关系，不过这次有区块节点纳入，所以就比较难一些了。因为待定唯一矩形的特殊性，即使有两个节点，我们也需要依次细致讨论，一共有三种情况：

* 如果 `r2c9(6)` 节点为真，则 `r23c1(8)` 为假，此时 `b1`、`r3` 和 `c1` 上均有关于 5 和 7 的显性数对；
* 如果 `r23c1(8)` 为真，则 `r2c9(6)` 为假，此时：
  * 如果 `r2c1(8)` 为真，则 `r3c1(8)` 为假，此时 `r3`、`c9` 和 `b3` 上会形成显性数对；
  * 如果 `r3c1(8)` 为真，则 `r2c1(8)` 为假，此时 `r2`、`c9` 和 `b3` 上会形成显性数对。

我们联立起来可以发现，三种情况都能涵盖的删数只有 `r3c8(57)`。所以，这个待定唯一矩形参与环的推理后，删数会多出来 `r3c8(57)` 这两个。

### 有一边在待定唯一矩形外部的强链关系 <a href="#single-side-external-strong-inference" id="single-side-external-strong-inference"></a>

<figure><img src="/files/784FDGsLep7E3FSFACmU" alt="" width="375"><figcaption><p>有点难的例子</p></figcaption></figure>

如图所示。这应该也比较难分析。我们还是先按待定唯一矩形两头的强链关系，分两种情况讨论一下。坐稳了，这里会稍微复杂一些。

因为有两个节点，而其中一个节点 `r4c89(4)` 用两个候选数，所以我们还需要分开算。于是，我们就有这样两个情况：

<figure><img src="/files/EzV0RHTtVxZL9qSW5Nsr" alt=""><figcaption><p>假设 r4c89(4) 为真的情况</p></figcaption></figure>

如图所示。如果我们让上面这个节点其中一个为真，则显然 `r9c9(3)` 这个节点就必须为假，于是 `r7c89` 会构成关于 1 和 3 的隐性数对。是的，因为我们得来这个强链关系之所以能连到待定唯一矩形的外面来，就是因为它这里用到的是“数字 1 和 3 差一点就隐性数对形成了”这个特征。所以，此时我们大大方方用隐性数对来看删数。哦对，也不完全是。因为删掉了 `r7c89(13)` 外的其他候选数后，这两个单元格又会自动变为显性数对，于是 `r7c6(3)` 这种删数也是可以在这个情况下干掉的。

这是第一个讨论情况。下面我们来看第二个情况：`r9c9(3)` 为真。这里就会麻烦一些了。

<figure><img src="/files/yJ0tI6j3AczirQIpvPtz" alt="" width="375"><figcaption><p>假设 r9c9(3) 为真的情况（？）</p></figcaption></figure>

如图所示。当假设 `r9c9(3)` 为真时，我们只能得到 `r4c89(4)` 为假，并得到上方的显性数对成立的情况。但是，这并没有帮助，因为前面一种情况的删数压根就没用到这里的显性数对（毕竟刚才那个情况下，这个显性数对根本就不成立）。

这可有些棘手了。那么我们继续深度思考。既然我们得来了这个 3 为真的情况，那么，数字 1 呢？3 虽然填不了了，但是数字 1 不是还能用么？想想看，数字 1 现在是什么？没错，共轭对。数字 1 在这里是单独独立出去的部分，虽然隐性数对被 `r9c9(3)` 拆了个“妻离子散”，但是 1 在客观上是共轭对的这个特征并未被我们挖掘。

不过我们这里不能直接用。先把视角看到 `c9`。我们发现，因为 `r4c89` 此时是不含数字 4 的（因为 `r9c9(3)` 此时已经为真了），所以对于 `r4c9` 而言，它现在只有 1 和 3。于是我们就会发现，这里多出来了一个显性数对：`r49c9`。这个显性数对使得 `r7c9` 不可填 1 和 3。

发现什么问题了吗？是的， `r7c9 <> 1` 之后，因为数字 1 有共轭对的缘故，此时 1 只能填在 `r7c8` 上。这也就是说，共轭对反而帮了我们一个忙。如图所示。

<figure><img src="/files/GR8SyCAyGMzwAXWQYLYk" alt="" width="375"><figcaption><p>假设 r9c9(3) 为真的情况（实际）</p></figcaption></figure>

是的，这样我们可以得到，分别在 `r4`、`c8`、`c9`、`b6` 和 `b9` 里都有关于 1 和 3 的数对结构，这样我们就可以发现，取三种情况的删数的交集似乎就有实际的结果了：`r7c8(25)`。

我们最终通过借用共轭对来完成了这个不太能发现的删数的推算。这非常神奇，希望各位对这个例子好好揣摩一下。

> 这里留一个问题。我们发现这个题存在这个共轭对对于删数的影响未免有些巧合。不过，请自行思考一下，对于这种强链关系一端在待定唯一矩形内部而另一边在外部的情况，当它嵌入到环里，是否都会存在类似的删数？以及，把问题推广到两端全都在外部的强链关系，在环里也是否存在删数？

我想，我应该把区块连续环的内容介绍得差不多了。下面我们来看轻松一点的吧。

## 对交空矩形（Empty Rectangle Intersection Pair）

我们来看一个简单点的例子。

<figure><img src="/files/ZGz0SM2FhrQy1pZwoso5" alt="" width="375"><figcaption><p>对交空矩形</p></figcaption></figure>

如图所示。你可以把他当结构看，也可以把他当成环来看。

从结构的视角切入的话，我们需要先尝试看看 `r3c1` 和 `r4c4` 都能填什么。这两个单元格显然只能填 3 或 4，而在 `b2` 里，3 和 4 具有类似空矩形的摆放构造。那么我们大胆一些，假设一下 3 和 4 的填数情况。

如果 `r3c1` 和 `r4c4` 填数相同，则我们会立马发现 `b2` 里，相同的这个填数则填不进去。因为 `b2` 里只有 `r12c4` 以及 `r3c56` 四个单元格可以放入 3 或者 4。不论两个单元格填的都是 3 还是都是 4，都是填不下的。因此，`r3c1` 和 `r4c4` 只能填入不同的数。

既然填的数不同，则我们仍然使用欠一数对的思路去假设字母。如果 `r3c1` 填 $$a$$、则 `r4c4` 假设填 $$b$$。那么我们可以轻松得到，`r12c4` 里肯定有一个单元格是 $$a$$，而 `r3c56` 里肯定也有一个单元格是 $$b$$。于是呢？于是 `r3` 上会出现关于 3 和 4 的显性数对，位于 `r3c156` 的其中两个单元格；而对于 `c3` 而言，也会存在一个显性数对。因此，删数就是 `r3c7 <> 3, r8c4 <> 34, r9c4 <> 4` 这样一些。

这是从结构的视角出发得到的删数。下面我们来看它是否能看成环。

答案肯定是可以的。这便是这个技巧的环的画法。

<figure><img src="/files/3Q2A9DWvv2deptc5NRlk" alt="" width="375"><figcaption><p>对交空矩形的环的画法</p></figcaption></figure>

如图所示。这看起来确实有些乱，但是它就是环的画法。我们直接把里面用到的两个空矩形拆成四个节点，然后按照横竖可以连接到 `r3c1` 以及 `r4c4` 的方向确定区块节点的走向。这便是它的环的画法。

我们把这个技巧称为**对交空矩形**（Empty Rectangle Intersection Pair，简称 ERIP）。下面我们再来看一个例子。

<figure><img src="/files/RdIokYgHmXMNdBRxpCYu" alt="" width="375"><figcaption><p>另外一个对交空矩形的例子</p></figcaption></figure>

如图所示。这个例子也希望你自己看。

好了，至此我们就把区块连续环的内容全部结束了。下面我们将继续讲解后面的内容。


# 强制链

Forcing Chains

我们继续延伸讨论链理论的内容。之前提到，链理论有多个思想。今天我们来看的是第二个思想。


# 强制链的基本推理

Reasoning of Forcing Chains

## 区域强制链（Region Forcing Chains） <a href="#region-forcing-chains" id="region-forcing-chains"></a>

<figure><img src="/files/nSB7DcsFZvTCB98Mg3wi" alt="" width="375"><figcaption><p>区域强制链</p></figcaption></figure>

如图所示。先别急着发飙。这看着是有点难，而且链的画法也发生了变化。

我们使用简易视角去理解它。我们假设 `r1c7 = 6`，就可以发现这个链是可以运作的。因为从 `r1c7(6)` 这里延伸出去的是弱链关系。虽然我们暂时还看不太懂为什么是按两个方向独立延伸出去的，但是至少两端都是弱链出去的，为了方便我们假设，可以尝试用 `r1c7 = 6` 去推导。

当假设了这个条件后，链的推导开始运作起来。三个分支的走向如下：

* `(6-1)r1c7=(1-9)r1c2`，走到 `r1c2(9)` 为假；
* `6r1c7-6r4c7=9r4c4-9r5c5=9r2c5-9r2c2`，走到 `r2c2(9)` 为假；
* `6r1c7-(6=4)r4c7-4r4c1=(4-9)r5c2`，走到 `r5c2(9)` 为假。

虽然看图看起来有些乱，但是理顺了之后发现还是比较清晰的。

我们先别急着提问为什么这次的假设是设节点为真，而不是为假。当我们试着假设初始条件后，这三个分支的走向能带领我们走向三个不同的结局。虽然他们之间是“平行世界”，互不影响对方，但最终的结论是都可以实现的。

由于 `c2` 里所有的数字 9 的填数位置，都能因为同一个假设情况推导得到其为假，这也就是在说，`c2` 里所有 9 的位置都能通过在假设 `r1c7 = 6` 时全部被干掉，此时，`c2` 将不存在任何可以填入 9 的位置。因此造成了矛盾。

既然我们知道，假设 `r1c7 = 6` 会使得矛盾形成，所以初始假设就是错误的。因此，`r1c7 <> 6` 的结论成立。

可以看出，这个推理的过程只是从形式上依赖了链的真假讨论，但最终推导得出矛盾的过程并未使用链的头尾取交集的方式，因此从形式上来看，它并不算一个合格的链结构，我们把这种推理过程称为**强制链**（Forcing Chains，简称 FC），即强制性推导的链。

> 因为强制链推导的时候一般会依赖多个分支得到不同的走向，因此技巧的英文名自身会带有复数后缀 -s，即 Forcing Chains 而非 Forcing Chain，这并不是打错，也并非是技巧名的复数形式，而是这个技巧自身就带复数后缀 -s。

证明某个节点假设为假时，整个列里的某个数全为假。我们把这个论证用到行列宫的形式称为**区域强制链**（Region Forcing Chains）；这里是得到列上无位置可填的矛盾，因此也可以精确称呼为**列强制链**（Column Forcing Chains）；不过本教程就不再细分宫、行、列强制链了，因为逻辑都是一样的。

> 区域强制链的区域是用的 region 一词而不是 house。在整个教程里，区域一般会用 house 来指代一个行、列、宫。这个技巧名的区域的含义其实和一般我们认为的区域是完全一样的，之所以用的另外一个单词，仅仅是因为这个技巧的体系制定是一款叫 Sudoku Explainer 的数独分析软件所定义的。这个软件将所有的链都称为强制链（包括我们前面学到的一些链），以便难度定级等行为；而 region 是这款软件给的叫法，他们没有使用 house 来表示区域，所有的区域都用的是 region，因此这个技巧名称的英文名用的也是 region。
>
> 是的，所有的链都可以转换为强制链。不过这显然有悖于我们教程对链理论的教学主旨，所以我不打算针对这种“细枝末节”进行单独的介绍。
>
> 总之，区域强制链的区域一词是这款软件的取名，所以本教程沿用这个叫法。

## 强制链与尤里卡记号 <a href="#eureka-notation-on-forcing-chains" id="eureka-notation-on-forcing-chains"></a>

强制链也可以使用尤里卡记号表示，但这也没有一个严格的标准。本教程暂时将其定义为使用分支的书写格式。具体方式仍然参考前面例子里使用分支的表达，不过要整理到一起，所以这个例子的写法是这样的：

```
6r1c7:
  1r1c7=(1-9)r1c2
  6r4c7=9r4c4-9r5c5=9r2c5-9r2c2
  (6=4)r4c7-4r4c1=(4-9)r5c2
```

我们使用空两格的方式（**缩进**，Indenting）来控制分支的表示；然后在最上方给予起点 `r1c7(6)` 的标识，在每一个分支里就不用再书写一次。

另外，如果强制链的分支并不是严格意义独立的（如之前的例子里，`r4c7(6)` 这个节点是其中两个分支重复使用的节点），那么你也可以继续将分支抽取出来，并再次用缩进的行为来列举他们。比如前面的例子还可以继续写成这样：

```
6r1c7:
  1r1c7:
    (1-9)r1c2
  6r4c7:
    9r4c4-9r5c5=9r2c5-9r2c2
    4r4c7-4r4c1=(4-9)r5c2
```

这表示的意思是，从 `r1c7(6)` 开始有两个走向（`r1c7(1)` 和 `r4c7(6)`）。然后根据两个走向，继续往后延伸链的走向。大概是这个感觉。

因为强弱链关系是交替使用的，所以我们可以通过分支上开头文本的 `-` 和 `=` 记号反推得来前面 `r1c7(6)` 到下面两个分支 `r1c7(1)` 和到 `r4c7(6)` 都是什么记号，所以符号可以省略不写。要写的话是写在分支的开头上，比如这样：

```
6r1c7:
  -1r1c7:
    =(1-9)r1c2
  -6r4c7:
    =9r4c4-9r5c5=9r2c5-9r2c2
    =4r4c7-4r4c1=(4-9)r5c2
```

这样就是一个相对完备的表示方式了。注意 `6r1c7` 这里因为是起头，所以它的左边肯定不会有强弱链的记号，不要画蛇添足。

## 单元格强制链（Cell Forcing Chains） <a href="#cell-forcing-chains" id="cell-forcing-chains"></a>

看完了区域强制链，我们再来看单元格强制链的例子。

<figure><img src="/files/EF1eB3zRU2EavO6ZbykY" alt="" width="375"><figcaption><p>单元格强制链</p></figcaption></figure>

如图所示。这个链的表示如下：

```
7r9c8:
  1r9c8=1r7c8-1r7c5=1r1c5-1r1c1
  (7=2)r5c8-2r5c7=2r1c7-2r1c1
  1r9c8=1r7c8-(1=8)r7c1-8r1c1
```

这个题和刚才非常类似，只不过把区域调为了单元格。证明方法完全一样：假设 `r9c8(7)` 为真，则我们会有三个不同的分支走向并得到三个不同的候选数为假的结论。但是，这三个候选数均在同一个单元格 `r1c1`，而 `r1c1` 也就只有这三个候选数。既然最初的假设为真会使得这三个候选数全都为假，那么 `r1c1` 必然会形成矛盾。所以最开始假设就是有问题的。因此，`r9c8 <> 7`。

## 设为假引发矛盾的强制链 <a href="#multiple-forcing-chains-with-false-assumption" id="multiple-forcing-chains-with-false-assumption"></a>

刚才我们都是通过假设为真得到矛盾的形态。那么假设为假是否也可以呢？答案肯定是可以的。下面我们就来看一个例子。

<figure><img src="/files/0TyepT2v0CgnryJpX2Fn" alt="" width="375"><figcaption><p>设为假起头的强制链</p></figcaption></figure>

如图所示。这个链的写法如下：

```
8r8c6:
  7r8c6-7r9c46=7r9c1-7r1c1
  7r8c6-7r9c4=7r2c4-7r2c2
  7r8c6-7r9c4=7r2c4-7r2c3
  8r8c7-8r9c8=7r3c8-7r3c3
```

可以看出，这个链具有四个分支，走向了 `b1` 所有填 7 的四个位置，并全部得到为假的情况。所以，引发了矛盾。

因为最初我们假设的是 `r8c6(8)` 为假才能得到矛盾，所以 `r8c6(8)` 应该为真，因此这个题的结论是 `r8c6 = 8`。


# 有技巧名的强制链

Named Forcing Chains

## 归并强制链（Merged Forcing Chains） <a href="#merged-forcing-chains" id="merged-forcing-chains"></a>

可以看到，前面在假设过程之中，我们用到的思路都是在假设某一个节点为真或假时候引发矛盾。下面我们来看强制链在合并后产生的删数效果。

<figure><img src="/files/DzeaG0TOtHmDHxhbFTQf" alt="" width="375"><figcaption><p>归并强制链</p></figcaption></figure>

如图所示。这个链的表示如下：

```
7r23c2:
  9r23c2-9r1c1
  (7-9)r9c2=9r9c7-9r1c7
7r3c5:
  (7-9)r1c5
```

之前我们介绍的强制链都是从一个节点出发的。这次我们从多个不同节点出发看看能不能推理。比如这个题，我们可以看到， 终点三个分支都指向同一个区域的三个同一个数字的摆放位置，这一点保留了下来；但是起点完全不一样。之前的起点还保留了同一个节点作为初始假设，这次倒好，直接都不一样了。

这是否能推理呢？答案是可以的。这里干脆我们把删数也作为节点纳入到链里，但是分开看。比如这个题，我们先看 `r3c1(7)` 这个候选数。

假设把他视为一个普通节点来看的话，那么它的下一个节点可以是 `r23c2(7)` 或者 `r3c5(7)`。因为之后的推理是强链关系出去的，所以我们这里添加的应该是一条弱链关系。换言之，我们应假设 `r3c1(7)` 纳入时的状态是假设它为真。那么，纳入后，可以看到这个链就退化为了一个很普通的区域强制链，并得到最终 `r1` 所有填 9 的位置全部为假，引发了矛盾。所以，这个假设不成立。

对于 `r3c3(7)` 而言，好像天助我也一般，它也可以纳入到强制链之中，并接入刚才完全相同的这两个节点，并仍然可以得到同样的矛盾。所以，这样一口气强制链就可以删两个数。

明白了吧。这种强制链仍然是普通的区域强制链或者单元格强制链，只不过我们把开始的节点稍微延后了一步：因为强制链的删数一般只有一个，所以我们延后了节点后，每个分支对应的起点发生了变化。那么他们就可以用类似普通链里“头尾删交集”的效果找出除了延后之前的那个节点以外，还可以纳入的节点都有哪些。然后一并删除。我们把这个过程称为**归并强制链**（Merged Forcing Chains），即把分支延后后归并得到多个删数的强制链逻辑。它提供了一个找多个删数的强制链的视角。

我们再来看一个例子。

<figure><img src="/files/s1b22M8uyUYfmGDirStD" alt="" width="375"><figcaption><p>归并强制链，另一个例子</p></figcaption></figure>

如图所示，这条链的表示如下：

```
7r9c5:
  (7-4)r7c4=(4-6)r1c4
  (7-6)r7c4
6r9c1:
  6r5c1-6r5c4
  6r5c1-6r5c456=9r5c45-9r5c7=9r1c7-(9=2)r2c8-2r3c8=(2-6)r3c4
```

这个题有四个分支，并归并为两个部分。

## 鳍链（Finned Chain） <a href="#finned-chain" id="finned-chain"></a>

### 基本推理 <a href="#reasoning-of-finned-chain" id="reasoning-of-finned-chain"></a>

试想一下，如果强制链的分支里有一个分支起步就是夭折的，这种链会有删数吗？

<figure><img src="/files/FVu4xa1vH2AXV2U1uWdu" alt="" width="375"><figcaption><p>鳍链</p></figcaption></figure>

如图所示。假设我们先忽略掉 `r1c5(4)`，我们就可以看到一个完整的链（准确来说，叫区块不连续环）：

```
4r4c6=6r3c6-(6=1)r1c5-1r3c46=1r3c9-1r2c7=(1-3)r6c7=3r6c5
```

然后就有了这样的删数。但是，看起来似乎多出来的 `r1c5(4)` 也并不会影响链的删数，因为这个多出来的数填到格子里，也可以删掉 `r6c5(4)`。所以，按鱼鳍的思路看这个数的话，它具有如下的两个情况：

* 如果 `r1c5(4)` 为假，则链成立，删数是 `r6c5(4)`；
* 如果 `r1c5(4)` 为真，则删除行列宫其余位置的 4，也包含 `r6c5(4)`。

所以，这个题的结论是 `r6c5 <> 4`。

可以看到，这是一个普通的链，外加了一个“鱼鳍”。我们把这种链称为**鳍链**（Finned Chain）。

我们再来看一个例子。

<figure><img src="/files/mCdtwLYDH04Ch4uzN30I" alt="" width="375"><figcaption><p>鳍链。另一个例子</p></figcaption></figure>

如图所示。这个例子也自己看吧。这个例子用了两个鱼鳍，假设方式是一样的，先假设鱼鳍都不存在，然后引出链；然后假设鱼鳍存在，于是按鱼鳍存在的位置删，最终交集删数。

### 这也叫强制链？ <a href="#is-it-a-forcing-chains" id="is-it-a-forcing-chains"></a>

你可能会问，这是强制链吗？是的，虽然看起来像是鱼鳍和普通链的结合，但如果你把鱼鳍视为一个独立的分支，并把其中任意一个强链关系拆解为一组可以用于删数的分支的话，那它就会变为强制链的视角。比如这个题，对于 `b9` 而言，一共有 4 处可以填 5 的位置。那么按照强制链的视角，讨论 5 的全部填数位置，其中两个分支（鱼鳍）将因为假设为真导致直接构成删数；剩下两个分支，就是图中连接为强链关系的 `r7c8(5)` 和 `r8c7(5)` 了。把它俩拆开，然后形成两个分支最终仍然可以到达 `r1c9(5)` 的地方。因此，它其实是可以转为强制链的视角的（尽管这非常没有必要）。

那么至此我们就把强制链的内容介绍完了。


# 动态链

Dynamic Chain

在介绍完了环和强制的思路后，接下来我们继续展开描述链的下一种推广思路：**动态**（Dynamic）。

动态链是一种特殊的链结构类型，它直接依赖链内部带有分支，甚至分支里带分支的套娃逻辑。从理念分类的角度来讲，强制链可以算作为动态链的其中一种形式，但是强制链本身提供的推理视角又较为独特，因此又可以单独列出，总之是这么个关系。

动态链的内容因为依赖于套娃的分支设计，所以有些时候会非常难以理解（尤其是找删数的时候）。所以我们打算花一些篇幅对动态链的设计和推理，以及删数分析进行细致讲解。它应该也是链理论最难以理解的内容了。


# 动态链的基本推理

Reasoning of Dynamic Chain

## 试数与线性动态链（Whip） <a href="#try-and-error-and-whip" id="try-and-error-and-whip"></a>

<figure><img src="/files/HFKBT9qT69gCbwP6ADze" alt="" width="375"><figcaption><p>试数</p></figcaption></figure>

如图所示。这是一个**试数**（Try & Error，简称 T\&E）的路径。所谓试数，就是真正意义上无脑尝试填入一个数，然后根据基础的数独规则（排除和唯一余数技巧）然后直接填出下一个数，这么级联下去；直到发现矛盾（比如说某个格子没有可以填的数之类的矛盾），这样便让我们知道，初始假设是错误的。

对于这个题而言，我们尝试选取 `r2c9(1)` 作为我们的“幸运儿”。假设它为真，则可对 `b1` 造成宫排除得到 `r3c1 = 1`，然后因为 6 的宫排除得到 `r1c3 = 6`，接着是列排除得到 `r5c3 = 8`，然后是宫排除 `r6c2 = 4`，然后由于初始假设可以排除 `r6c9(1)` 的填数，所以还可以得到行排除 `r6c6 = 1`，最终对 `b8` 作宫排除得到 `r7c5 = 1` 这么个路径。

当我们在尝试假设这个路径时，我们会经过 `r1c3 = 6` 和 `r7c5 = 1` 这样两个关键节点。这两个节点会排除 `r78c3` 里的候选数 1 和 6，使得 `r78c3` 只剩下 2 唯一的候选数。显然这两个单元格是无法填入同样的数字的，毕竟他们在同一个宫，因此这样就造成了矛盾。

既然有了矛盾，因此我们也就知道，初始假设是错误的。故 `r2c9 <> 1`。

显然，对于这种赤裸裸地假设和推导矛盾，我们没有任何包装的措施和手段。换言之，这种无脑试 + 推矛盾的逻辑虽然也依赖数独的基础规则，但因为它本身的过程并不优雅，因此试数还是少用为妙。不过，我这里不是打算说这个的。

如果我们把这个技巧包装一番，将其改写为强制链的模式，我们就会有这样的画法：

<figure><img src="/files/0EGAO2bQ1zckA2VzdX3U" alt="" width="375"><figcaption><p>线性动态链</p></figcaption></figure>

如图所示。可以看到，我们尝试在推导时会用到图中两处蓝色的位置，而他们初始状态下候选数是存在的；但是他们在推导期间，因为其他一些节点为真的原因，这两处会直接为假。为假不要紧，主要是用到了他们为假的状态。这是我们最初学链的时候所没有遇到的情况：将一些节点中途为真/假的状态加以使用，然后构造出新的强弱链关系。我们就把这种行为称为**动态链**（Dynamic Chain）。而对于试数这个技巧，我们可以包装出来的动态链是直接上手推理的，因此没有所谓的分支状态；而分支全部当场就“夭折”了——比如这两个蓝色的 1，全部是走边上的 1 为真时产生的为假状态。而这个为假的状态并未继续延续下去分支的走向，而是直接结束在这里。

对于这样的动态链模式，我们给他取了个名，叫做**线性动态链**（Whip），即动态链的分支并未延展开来，而总体的链仍旧是一条主线路这么下去的。它的英文名叫做 whip，是鞭子的意思，从形状上讲也确实蛮像的。

我们再来看一个例子。

<figure><img src="/files/pfxHxjuwGqpPVL8Kz3ay" alt=""><figcaption><p>线性动态链，另一个例子</p></figcaption></figure>

如图所示。这次也是尝试填一个数，推矛盾。不过这次的矛盾点是删空 `r5c1` 的所有候选数。对应的动态链是右边这一条。所有蓝色的位置都是中间产生的、节点为假的位置。

## 区块线性动态链（Grouped Whip） <a href="#grouped-whip" id="grouped-whip"></a>

刚刚说完了线性动态链，下面我们来看两个带有区块的线性动态链，即除了只使用排除和唯一余数外，还使用区块作为推导的中间件。

<figure><img src="/files/J19FRbRSuVeD9V1ZRtkA" alt=""><figcaption><p>区块线性动态链</p></figcaption></figure>

如图所示。对于试数角度而言，我们这里需要借助 `r46c8(8)` 区块作为辅助。它的前一步是得到 `r6c9 = 5` 的结论，于是，这个宫里填入 8 的位置就只剩下两处了。但这两处并未告知具体哪一个是正确的，因此只能用区块继续往下推理。我们利用这个区块，往下可以得到 `r9` 上 8 的行排除。注意这里不是宫排除，因为 `r7c7` 处有一个 8 的候选数位置，这里需要借助的是初始假设把 `r9c3` 占位，使得 8 只能在 `r9` 落在 `r9c7` 的这个逻辑。

总之我们可以得到矛盾点是 `c9` 的 4 直接矛盾。要注意 `c9` 虽然有 4 个可以填 4 的位置，但是其中两个会在推导的中间因为填入别的数（8 和 5）占位给去掉，所以实际上仍旧是两处位置重复填写的矛盾。

我们把中途额外利用区块了的线性动态链就称为**区块线性动态链**（Grouped Whip，简称 g-Whip）。

我们再来看一个例子。

<figure><img src="/files/cTIAaJ1aYLzswNQ3Wg9G" alt=""><figcaption><p>区块线性动态链，另一个例子</p></figcaption></figure>

如图所示。

## 带有实际分支的动态链

在我们接触了夭折的分支后，我们来看一种实际分支的动态链。

<figure><img src="/files/JRM3GZ3DiA9X8Cokk4ew" alt="" width="375"><figcaption><p>动态链</p></figcaption></figure>

如图所示。链的写法如下：

```
1r4c2:
  =1r6c3-(1=9)r2c3-9r2c6
  =(1-9)r6c3=9r6c7-9r1c7=9r3c8-9r3c6
=9r4c6
```

先来说一下这是什么意思。先是从 `r4c2(1)` 这个节点设为假，作为链头。然后得到强链关系得到 `r6c3(1)` 为真。此时，因为 `r6c3(1)` 为真会同时造成两种不同的效果 `r2c3(1)` 为假和 `r6c3(9)` 为假，于是借助两个分支分别讨论。其中一个分支能走到 `r2c6(9)` 为假，另一个分支能走到 `r3c6(9)` 为假。因为两个分支的出发点是相同的（`r6c3(1)` 为真），因此这两个效果可以同时达成。于是，`c4` 就只剩下 `r4c6` 可以填 9 了，于是两个节点此时全部指向 `r4c6(9)` 分支汇集到一起，然后结束整个动态链。

像是这种链就是在普通的头尾异数链的基础上增加了分支。

我们再来看一个例子。

<figure><img src="/files/uY0i3Tvxm5pKuWXIpumb" alt="" width="375"><figcaption><p>动态链，另外一个例子</p></figcaption></figure>

如图所示。它的写法如下：

```
3r2c2=3r2c3-3r9c3:
  =2r9c3-(2=6)r8c2
  =4r9c3-(4=6)r3c3
```

当走到 `r9c3(3)` 节点为假时，因为还剩下两个走向 `r9c3(2)` 和 `r9c3(4)` 尚不知道具体哪一个节点为真，因此需要带上分支继续延续推理。然后一边走到了 `r3c3(6)` 为真，一边走到了 `r8c2(6)` 为真，这样就得到了两个没有汇入一起的分支，整个链就有了三个端点。

可以发现，这种动态链的结论肯定是要么链头 `r2c2(3)` 为真，要么两个链尾 `r8c2(6)` 和 `r3c3(6)` 的其中至少一个为真，所以总体说起来就是这三个端点里至少有一个为真。因此，删数就是取交集，即本题里的 `r2c2(6)`。

## 总结 <a href="#conclusion" id="conclusion"></a>

动态链的本质思路是让路径上带有分支，这种分支具有两种不同的情况：**分叉**（Branching）和**汇合**（Merging）。分叉细分的话也是两种情况，强链分叉和弱链分叉。这个具体随着例子里的推导进行到哪一步进行灵活调整即可；而对于汇合来说则略微复杂一些。当需要汇合时，汇合到同一个节点，它的前件分支（汇入到它的所有分支）需要保证是同一个真假性。比如说，两个分支最终都得到了为假，然后汇到同一个节点上时候，这个节点为真。这才是符合逻辑的；反过来说的话就是，这个汇总的节点为真，需要依赖于前面两个分支均为假才行（如果有一个为真就不可能和这里连得起来）。

当然，这种脑子够用的话，这种分支是可以继续进行下去的（我指的是分支上套分支）。但是，这显然难度偏高，我也没有合适的例子提供讲解，所以就不讲了。

下一节我们继续探讨动态链的分析。


# 动态强制链

Dynamic Forcing Chains

本文讨论强制链加上分支的情况。虽然说强制链自身带有分支，但这里说的是每一个分支上的子分支的情况。

请注意。本文的内容的复杂度过高，对于平时做题来说没有任何的帮助，只是为了给各位展示分支带分支的套娃逻辑，仅供观赏。

## 动态单元格强制链（Dynamic Cell Forcing Chains） <a href="#dynamic-cell-forcing-chains" id="dynamic-cell-forcing-chains"></a>

<figure><img src="/files/ikOjA4O3K3kL6b58X6Oc" alt="" width="375"><figcaption><p>动态单元格强制链</p></figcaption></figure>

如图所示。这还算比较短的，我实在是找不到合适的例子了……这个例子的写法如下：

```
    1r5c6:
      -1r5c1
      -(1=2)r5c2-2r5c1
      -(1=2)r5c2-(2=4)r6c3-4r5c1
    =6r5c1-6r5c8
    1r5c6-1r5c8
  =7r5c8-7r6c9
  1r5c6-(1=2)r5c2-(2=4)r6c3-4r6c9
=1r6c9-1r7c9
(4-1)r5c6=1r7c6-1r7c9
(5-1)r5c6=1r7c6-1r7c9
```

首先是从 `r5c6` 作为分支讨论，跟之前单元格强制链的方式完全相同。接着我们需要挨个讨论 1、4、5 三种数字填入后产生的效果。

其中数字 1 为真后，会同时引发同行其余位置的 1 全为假。但是每一个 1 的走向不同，所以这里会诞生新的若干分支。其中。其中 `r5c2(1)` 为假的这个分支会走向 `r5c2(2)` 并往下延伸；延伸到 `r6c3(4)` 则还有继续的分支。不过，这里其中一个分支的填数，算上 `r5c2(2)` 为真的状态，会使得 `r5c1` 的除了 6 外的数字全为假，然后就可以合并到 `r5c1(6)` 为真这个节点上；与此同时，另一边 `r5c8` 也可以得到汇总。

错综复杂的连接最终形成了这样的分支状态图：

<figure><img src="/files/JuyVOJzitHUTndO5fgYr" alt=""><figcaption><p>分支状态图（没有区分强弱链关系）</p></figcaption></figure>

这个图没有区分强弱链关系，只是单纯把节点的叠加操作和行为列举了一次。只要有强链或者弱链关系的都有箭头指向。可以看到，最终删数 `r7c9(1)` 的前件用的是 `r6c9(1)` 和 `r7c6(1)` 取交集得来的。

我们把单元格强制链带有动态分支的情况称为**动态单元格强制链**（Dynamic Cell Forcing Chains）。

## 动态区域强制链（Dynamic Region Forcing Chains） <a href="#dynamic-region-forcing-chains" id="dynamic-region-forcing-chains"></a>

<figure><img src="/files/jFBiHZ559kPBdhTvJ8B5" alt="" width="375"><figcaption><p>动态区域强制链</p></figcaption></figure>

如图所示。实在是有点复杂，我都懒得写文本描述了。总之就是分支讨论三个 4 的填数，最终都能删除同一个数。只是这个例子也具有分支的逻辑，因此看起来会复杂一些。

这个题就自己看了。

我们把这种区域强制链里带动态分支的情况称为**动态区域强制链**（Dynamic Region Forcing Chains）。

## 动态矛盾强制链（Dynamic Contradiction Forcing Chains） <a href="#dynamic-contradiction-forcing-chains" id="dynamic-contradiction-forcing-chains"></a>

### 基本推理 <a href="#basic-reasoning-of-dynamic-contradiction-forcing-chains" id="basic-reasoning-of-dynamic-contradiction-forcing-chains"></a>

由于动态链的关系，动态强制链会比之前普通强制链要多出两种类型。

<figure><img src="/files/f92IxJnkmEmHBdl0ulfN" alt="" width="375"><figcaption><p>动态矛盾强制链</p></figcaption></figure>

如图所示。这种强制链的讨论方式是假设某一个节点为真（或者假设为假），如果能得到某一个节点既为真又为假的情况（换言之，就是推导走向两个完全独立的分支，分支最终汇聚到同一个节点上，但真假性完全互斥）。这个时候我们就认为，原始假设存在矛盾，因为原始假设会同时造成某一个节点既对又错的情况。

比如这个题，拆解为两个分支，就是这样的：

<figure><img src="/files/QMwXlkrzXQP59UtSIdNI" alt=""><figcaption><p>形成矛盾的两个不同的分支</p></figcaption></figure>

如图所示。可以看出，左图里展示的是可以到达 `r6c6 = 7` 的情况，而右图展示的是 `r6c6 <> 7` 的情况。这便是形成矛盾了。

所以，最初的假设（`r9c1 = 4` 这个假设）是错误的，故删除这个候选数。

我们把这种论证某一个节点会导致某一个节点既真又假的矛盾状态的强制链类型称为**动态矛盾强制链**（Dynamic Contradiction Forcing Chains）。因为这种论证逻辑只依赖于真和假的矛盾，所以这个技巧出现就一定只有两个分支。只是说这两个分支里会带有子分支的情况。

### 为什么非动态强制链里不存在矛盾强制链这种类型？ <a href="#why-contradiction-forcing-chains-may-not-exist-in-non-dynamic-chaining" id="why-contradiction-forcing-chains-may-not-exist-in-non-dynamic-chaining"></a>

另外，之所以说普通强制链（没有动态分支的强制链）不存在矛盾强制链这种类型，是因为证明得到矛盾的节点，这个位置在两个视图下的分支是可以合并成一条普通链的。比如说 $$A \to B' \to C \to D'$$ 这个分支（带撇号的表示为假，不带的表示节点为真）和 $$A \to E' \to F \to G' \to D$$ 这个分支因为最终汇聚到 $$D$$ 节点，但真假性并不相同，于是我们就可以把他合并为 $$D \to G' \to F \to E' \to A \to B' \to C \to D'$$ 这一条链（把其中一个分支反向，并拼接到节点 $$A$$ 上去就可以完成合并）。把头尾重复的 $$D$$ 节点删去，这便是一条设 $$G$$ 节点为假的普通链，能推到 $$C$$ 节点结束。删数是这个 $$D$$ 节点了。这就是为什么说矛盾强制链是不存在于非动态的情况里的真正原因。

## 动态二值矛盾强制链（Dynamic Double Forcing Chains） <a href="#dynamic-double-forcing-chains" id="dynamic-double-forcing-chains"></a>

还剩下一种。这种也是矛盾强制链，不过稍微有点不一样。

<figure><img src="/files/v6CsdSiO30gm2NV3f5QL" alt="" width="375"><figcaption><p>动态二值矛盾强制链</p></figcaption></figure>

如图所示。这是不是无从下手？我们反过来看。

<figure><img src="/files/uVtPat0WXy9IQPByikXd" alt=""><figcaption><p>拆解开的两个视图</p></figcaption></figure>

如图所示。其左边的视图是假设 `r2c2 = 2` 的情况；右图则是假设 `r2c2 <> 2` 的情况。这个例子比较好的一点是，左图这个分支直接可以对应到删数上，所以完全不用费额外的工夫去理解它。

当两种情况同时考虑后，我们发现，删数是 `r9c1(2)`，它是两种情况下都能删除的数。所以，这个题的结论就是 `r9c1 <> 2`。

这个技巧叫做**动态二值矛盾强制链**（Dynamic Double Forcing Chains）。如果你忽略左图这个分支的话，其实可以看到，单独看右图这个分支其实就可以已经单独提出去当作一个动态链来看了（只是很复杂罢了）。之所以这也算一种技巧，是因为分析软件 Sudoku Explainer 不存在普通的动态链的逻辑，它的这个技巧用于完成普通动态链的删数工作。

至此就把四种动态链里的强制链部分说完了。

## 动态强制链的尤里卡记号 <a href="#eureka-notation-in-dynamic-forcing-chains" id="eureka-notation-in-dynamic-forcing-chains"></a>

一般来说，我们都不用怎么担心尤里卡记号写不了动态链。因为动态链实在是过于复杂，因此很多时候它的表述更加“主观”一些，写起来比较随意一些，毕竟这个记号模式确实在动态链里没有相关的严格标准规范。

我推荐的做法是，将分支逐条列出，然后根据列出的分支按照分叉和汇入的规则排好顺序。排序之后，然后按缩进的方式表达。比如说最开始的那个例子：

{% code title="整条动态链的尤里卡记号" lineNumbers="true" %}

```
    1r5c6:
      -1r5c1
      -(1=2)r5c2-2r5c1
      -(1=2)r5c2-(2=4)r6c3-4r5c1
    =6r5c1-6r5c8
    1r5c6-1r5c8
  =7r5c8-7r6c9
  1r5c6-(1=2)r5c2-(2=4)r6c3-4r6c9
=1r6c9-1r7c9
(4-1)r5c6=1r7c6-1r7c9
(5-1)r5c6=1r7c6-1r7c9
```

{% endcode %}

在这个例子里，打头的是这个部分：

{% code title="最内层分支" lineNumbers="true" %}

```
1r5c6:
  -1r5c1
  -(1=2)r5c2-2r5c1
  -(1=2)r5c2-(2=4)r6c3-4r5c1
=6r5c1-6r5c8
```

{% endcode %}

这一部分表示的是 `r5c6(1)` 作为起头，然后引出三个分支。这三个分支因为最终都走向了 `r5c1` 的候选数，所以引出了 `r5c1(6)` 为真的情况。然后继续。而外层的缩进：

{% code title="中间层分支" lineNumbers="true" %}

```
  1r5c6:
    -1r5c1
    -(1=2)r5c2-2r5c1
    -(1=2)r5c2-(2=4)r6c3-4r5c1
  =6r5c1-6r5c8
  1r5c6-1r5c8
=7r5c8-7r6c9
```

{% endcode %}

则表示的是最上面整个一坨动态链分支（第 1 到 5 行），然后算上新的 `r5c6(1)` 到 `r5c8(1)` 这个分支（第 6 行）后，因为结尾都指向 `r5c8` 单元格，因此汇入到 `r5c8(7)` 为真的节点上。然后最外层：

{% code title="最外层分支" lineNumbers="true" %}

```
    1r5c6:
      -1r5c1
      -(1=2)r5c2-2r5c1
      -(1=2)r5c2-(2=4)r6c3-4r5c1
    =6r5c1-6r5c8
    1r5c6-1r5c8
  =7r5c8-7r6c9
  1r5c6-(1=2)r5c2-(2=4)r6c3-4r6c9
=1r6c9-1r7c9
```

{% endcode %}

这一层则和刚才类似，先是上面一整坨内容（中间层分支那一坨内容，即这里最外层分支里第 1 到 7 行的部分）是一个分支，它汇入到了 `r6c9(7)` 上，然后和另外一个分支（第 8 行）的末尾 `r6c9(4)` 都指向 `r6c9`，于是他们一起汇入到 `r6c9(1)` 得到为真的结论，最终走到 `r7c9(1)`（删数）上来。

所以，我们通过缩进就可以控制同一层级的强弱链关系，这样不会造成歧义的同时还能严格表示出所有的动态强制链。

总结一下。使用尤里卡记号表示的时候，如果需要分叉，就用冒号来表示；冒号一般意义上来说也是可以省略的，缩进是可以表示出来分叉的含义的，但延续之前冒号表示每一个分支走向时的写法，所以这里才保留了冒号。另外，如果需要汇入分支，则需要确保分支是否全部列举完毕，他们必须在同一个缩进层级，然后退回一层缩进（**取消缩进**，Unindenting）来表示汇入后的分支是它上一级的情况。

下一节我们将开始探讨动态环的删数逻辑。


# 动态环的删数分析

Elimination Analysis on Dynamic Loop

本文将探讨动态分支逻辑下最难的一点：动态环的删数。

## 动态环（Dynamic Continuous Loop） <a href="#dynamic-continuous-loop" id="dynamic-continuous-loop"></a>

<figure><img src="/files/6yT8cdGlC39bmxDMtL0v" alt="" width="375"><figcaption><p>动态连续环</p></figcaption></figure>

如图所示。之前就说环没有起点，现在倒好，还加入了分支的设定，这下彻底没办法看了。

别急。我们先找出这个环里的分支位置。可以看到，这个环的分支在 `r7c6` 这个单元格。进入这个单元格里的是弱链关系（`8r7c2-8r7c6` 这个弱链关系），所以下一个应该是强链关系。但很明显，这个单元格有三个候选数，根本就不存在强链关系，所以我们需要借助分支的方式进行讨论。

当分支走向 `r7c6(2)` 的时候，我们会绕到 `r5c8(2)` 为真，然后 `r5c8(1)` 为假；当分支走向 `r7c6(5)` 的时候，我们会走上面，带待定数组这个分支。然后照样会到 `r5c8(1)` 为假。此时汇入同一个候选数节点上，继续朝左，并最后又会回到 `r7c6` 这个分叉的单元格上。

这个环具有两个分支，并最终会汇入到同一个候选数上，因此就是很简单的动态的逻辑。不过，因为它收尾相连的时候不存在任何推导上的矛盾，所以这个环可以这么周而复始地无限进行下去。所以，它从定义上来看是符合环的特征的。但是，因为它有动态的因素在里面，所以删数都含有哪些呢？

从逻辑的角度来看，我们很清楚地知道，动态所产生的分支，他们各自是独立的状态；也就是说，他们两边是并列的关系，我们只能知道他们从形式上满足环的特征，但实际具体哪一个分支是这个题最终的选取结果，我们并不清楚。说人话就是，虽然我们知道 `r7c6` 这里有分支了，但是我们不清楚 `r7c6` 在答案上填的是哪个数字，也就意味着我们并不能判断这个链的分支走向具体是哪一边是成立的。这也告诉了我们，虽然环是可以全弱链删数的，但这一点被动态的分支所打破，所以我们不能盲目地使用之前的结论套用到动态环上去。

于是，我们整理了思路，我们发现，整个环里分叉出去的部分肯定是不能删数的，而只有汇入了之后，到分叉之前的这个部分里，所有弱链关系才能用于删数。对于这个题来说，只有 `1r5c8=1r5c2-(1=8)r7c2-8r7c6` 这一截的弱链关系可以用来删数。梳理出来，这个题的删数就只有 `r7c5 <> 8` 这一个结论。

我们把这个环称为**动态连续环**（Dynamic Continuous Loop），简称为**动态环**。

等会儿！你可能会问我，连续环的英文不是 continuous nice loop 么，这 nice 这个单词呢？别急。下面我们就来说说这个动态环的分类。

## 全环和半环 <a href="#nice-loop-and-non-nice-loop" id="nice-loop-and-non-nice-loop"></a>

对于动态环而言，因为动态分支的特征，所以环里可能弱链关系不全可以用于删数。所以，对于动态环来说，环是分为全弱链删数和非全弱链删数两种情况的。像是刚才讲解的例子里，它就属于非全部弱链都能删数的这种情况。我们把这种称为**半环**（Non-nice Loop）；相反地，我们把动态环里所有弱链都可以用于删数的环，称为**全环**（Nice Loop）。是的，这个 nice 用来表示的是环上是否全部弱链都可以参与删数。当为半环的时候，一般是用 non-nice 一词修饰，或者干脆就不写。比如刚才这个题，严格取名的话，应该是叫“动态连续半环”的，而半环的 non-nice 一般不写出来用来和 nice 区分，所以英文名的 nice 才会不见的。

我知道，你肯定会问我，既然是动态环，自然会产生分支。就刚才例子来看，这种分支显然是客观并列的形态，所以肯定不是所有弱链都可用于删数。但是也确实想不到有什么情况下，动态环还能是全环的情况。

如果我们从这个分支的视角去理解动态环删数的话，那么势必是想不通的，因为它没有触碰最为本质的逻辑。我们先了解一下，对于刚才这种环，删数并不是全部弱链关系的最底层、最本质的原因。当我们知道了这个原因后，我们就知道为什么动态分全环和半环，以及什么时候动态环是全环状态。

## 弱链删数分析 <a href="#elimination-analysis" id="elimination-analysis"></a>

抓住删数的本质，就是去找寻为什么弱链上的候选数有的可删，有的不可删。

我们回忆一下普通的连续环。非动态的连续环的所有弱链关系上均可引发删数，其本质原因是，我们清楚地知道，所有弱链都可以先拆开，然后形成普通的链后，按普通链删数；而其链的删数恰好就是弱链关系连接的这个走向上。换一种说法的话，我们可以知道的是，弱链两头的端点总会有其中一个节点是为真的，它可以保证我们这个弱链上必然存在可用于删数的节点信息。

记住这一点。**弱链两头的端点总会有其中一个节点是为真的**，所以这个弱链可以用作删数。我们将基于这个规则来看动态环的删数分析。

我们回到刚才的例子。这个动态环需要分析是否弱链两头的端点是否真的会有其中一个节点为真。

<figure><img src="/files/6yT8cdGlC39bmxDMtL0v" alt="" width="375"><figcaption><p>还是那个动态环</p></figcaption></figure>

如图所示。现在我们需要分析它的填数状态，那么我们就需要排列出整个环里所有节点的真假状态。

<table><thead><tr><th width="99.86663818359375">情况编号</th><th>为真的节点</th></tr></thead><tbody><tr><td>1</td><td>r1c6 = 5、r2c5 = 1、r3c8 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2</td></tr><tr><td>2</td><td>r1c6 = 5、r2c5 = 6、r3c8 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2</td></tr><tr><td>3</td><td>r1c6 = 5、r2c5 = 6、r2c7 = 1、r5c2 = 1、r5c8 = 2、r7c2 = 8、r7c6 = 2</td></tr><tr><td>4</td><td>r1c6 = 5、r2c5 = 6、r2c7 = 1、r5c8 = 1、r7c2 = 1、r7c6 = 8、r7c8 = 2</td></tr><tr><td>5</td><td>r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 5、r7c8 = 2</td></tr><tr><td>6</td><td>r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 5、r5c8 = 2</td></tr><tr><td>7</td><td>r1c6 = 6、r2c5 = 1、r3c8 = 1、r5c2 = 1、r7c2 = 8、r7c6 = 2、r5c8 = 2</td></tr></tbody></table>

而这个环用到了如下的一些弱链：

<table><thead><tr><th width="200.13323974609375">弱链关系</th><th width="130.06671142578125">隶属</th><th>备注</th></tr></thead><tbody><tr><td><code>1r5c2-1r7c2</code></td><td>主线</td><td></td></tr><tr><td><code>8r7c2-8r7c6</code> </td><td>主线</td><td></td></tr><tr><td><code>5r7c6-5r1c6</code> </td><td>分支</td><td></td></tr><tr><td><code>1r3c8-1r5c8</code></td><td>分支</td><td></td></tr><tr><td><code>2r7c6-2r7c8</code> </td><td>分支</td><td></td></tr><tr><td><code>(2-1)r5c8</code> </td><td>分支</td><td></td></tr><tr><td><code>r1c6(6)</code> 和 <code>r2c5(6)</code></td><td>待定数组</td><td>如果待定数组要参与删数，这里俩 6 就会发挥删数的作用</td></tr></tbody></table>

> 这里带了个待定数组会无形之中增加分析的难度，但好在这个题删数用不上它。
>
> 假如哈，我是说假如，假如这个待定数组可以用作删数，那么这俩 6 就会被考虑在内。虽然它不算弱链关系，但因为待定数组被我们整体分析的，所以删数考虑起来会麻烦非常多。不过，对于这个题而言，因为待定数组的结构还算简单，所以其实可以转为普通的强弱链关系，如 `(5=6)r1c6-(6=1)r2c5` 这样迂回地走过去，这样的话 `6r1c6-6r2c5` 的弱链关系就会体现出来；那么删数分析的时候，这两处的 6 如果有删数就会被我们前面列举的弱链关系的这个表格所记录，就不会造成删数遗漏。

我们对比前面得到的 7 种不同的排列情况，然后强行去找是否弱链关系的其中一个端点在这个情况组合下为真的。于是我们又会得到这一张表：

<table><thead><tr><th width="150.33331298828125">弱链关系</th><th width="330">包含两端其中一端为真的情况编号</th><th>是否可以参与动态环删数</th></tr></thead><tbody><tr><td><code>1r5c2-1r7c2</code></td><td>1、2、3、5、6、7（r5c2 = 1）；4（r7c2 = 1）</td><td>⭕</td></tr><tr><td><code>8r7c2-8r7c6</code></td><td>1、2、3、5、6、7（r7c2 = 8）；4（r7c6 = 8）</td><td>⭕</td></tr><tr><td><code>5r7c6-5r1c6</code></td><td>1、2、3、4（r1c6 = 5）；5、6（r7c6 = 5）</td><td>❌（缺少情况 7）</td></tr><tr><td><code>1r3c8-1r5c8</code></td><td>1、2、5、6、7（r3c8 = 1）；4（r5c8 = 1）</td><td>❌（缺少情况 3）</td></tr><tr><td><code>2r7c6-2r7c8</code></td><td>1、2、3、7（r7c6 = 2）；4、5（r7c8 = 2）</td><td>❌（缺少情况 6）</td></tr><tr><td><code>(2-1)r5c8</code></td><td>1、2、3、6、7（r5c8 = 2）；4（r5c8 = 1）</td><td>❌（缺少情况 5）</td></tr><tr><td><code>6r1c6-6r2c5</code></td><td>2、3、4（r2c5 = 6）；5、6、7（r1c6 = 6）</td><td>❌（缺少情况 1）</td></tr></tbody></table>

在完整列举完毕后，我们可以清楚地知道，只有头两个弱链关系，在所有 7 种可能的排列下，全都存在两端至少有一端为真的情况。所以，这两个弱链关系可用于删数；但后面几种均不可用于删数，因为并非全部情况都存在两端至少有一端为真。

因为我们保证稳定删数是需要要求所有可能填数均需要让删数成立的，所以但凡其中有一种情况不成立，那么整个弱链关系就不能用作删数了。可以从表里看出，后续的弱链关系每一个都只存在一种情况不满足，但就正是因为这缺少的情况，导致整个弱链关系在这种情况下不构成至少一端为真，进而无法保证它能用作删数。

总之，要想让弱链关系用于删数层面，需要使得这个弱链关系能在所有可能的填数排列形态下（不违背数独规则的、能填写到节点上的所有填数可能），验证弱链两端是否在所有情况下均存在至少一端为真。我们把这种分析删数的行为称为**删数分析**（Elimination Analysis）。

## 绽放环（Blossom Loop） <a href="#blossom-loop" id="blossom-loop"></a>

下面我们来看一个稍微复杂一些的技巧。

有没有想过，当强制链形成回环后，会有什么样的效果呢？

<figure><img src="/files/mzFdF8VMdrtAA3xVyWBZ" alt="" width="375"><figcaption><p>绽放环</p></figcaption></figure>

如图所示。本题其实是强制链，并带有三个分支，从 `r1c7` 单元格出发，并回到 `r4` 的所有 6 的位置上。非常巧妙的是，这个题的分支有 3 个，他们完全不同；最终走到 `r4` 上时，每一个分支都会唯一对应到一个 6 的位置上去。所有强链关系引出，并用弱链关系引入。写法如下：

```
6r1c7=6r1c2-6r7c2=6r7c1-6r4c1
7r1c7=(7-1)r1c5=1r9c5-(1=6)r9c4-6r4c4
8r1c7=(8-6)r4c7
```

看起来这个似乎跟前面任何的强制链的思路都没有关联。这是怎么删数的呢？我们思考一个问题哈。本题的强链关系出去，弱链关系收回的逻辑会不会存在一些特殊效果？

我指的是什么效果呢？比如说，我们显然发现，弱链收回的 `r4` 实际上仅存在这三个可以放 6 的位置，不存在其他单元格可以填 6。这说明什么？这说明 6 必须落入其中一个分支上。而我们之前说过，链是可以逆向的，那么对于强弱链关系来说，我们就可以从终点往回看，这样就可以满足三个 6 的位置的其中一个分支起点假设为真的逻辑。

按照这个思路进行，我们最终会回到 `r1c7` 这个单元格。因为回去的三个分支全部是强链关系，所以也就意味着我们最终会得到 `r1c7` 里其中一个候选数为真。既然其中一个候选数为真，那么剩下的两个就会变为假的状态。于是？于是这个链的其余两个分支就可以顺推回到 `r4` 的另外两个 6 的填数位置上去，使得剩下两个分支的 6 为假。

这可能有些绕。我说细致一些。我想说的是，因为我们知道 `r4` 只有三处填 6 的位置。假设填入其中一个位置（假设此时是 $$A$$ 这个位置填），那么剩下的俩 $$B$$ 和 $$C$$ 就为假；但是，我们也可以通过先从 $$A$$ 这个位置反推回单元格 `r1c7` 的三个候选数上（暂且记作 $$A'$$、$$B'$$ 和 $$C'$$）。

在我们假设 $$A$$ 为真的时候会得到 $$A'$$ 为真（因为尾巴这里是强链关系，从假到真的是强链关系）；而 $$A'$$ 为真的同时又可以直接认定 $$B'$$ 和 $$C'$$ 是为假的，于是 $$B$$ 和 $$C$$ 按顺推就会为假（因为这次尾巴这里是弱链关系，从真到假的是弱链关系）。于是就构成了这么个链路关系：

$$
A \text{真} \to A' \text{真} \to B' \text{假}\ C' \text{假} \to B \text{假}\ C \text{假}
$$

我们再次假设 $$B$$ 和 $$C$$ 两边时也都可以分别得到类似的结论，且所有强弱链关系均不会造成推断矛盾（比如说“本来设为强链关系的，但是假设了其中一个数为真的时候这里不成立了”之类的问题）。这意味着它形成了完美的思路闭环。这里说的“思路闭环”是说它的推导过程是完全闭环的，不会通过任意的位置走出这个推导线路。总之就是，因为 $$A$$、$$B$$ 和 $$C$$ 的填数状态是互斥的（整个行只有一个可以填 6 的位置，也必须有一个填 6 的位置），所以三者不能共存。而我们任意保留其中一个，都能使得整个链路回环运作起来且不发生矛盾。

而对于我们刚才反推的“中转站”单元格 `r1c7` 而言，因为三个分支均会走这个单元格的其中一个候选数经过且均都是为真的状态经过的，所以 `r1c7` 里的三个候选数 6、7、8 必须有一个为真。当然，这个题的 `r1c7` 不存在其他的候选数；如果有的话，这个单元格的其余候选数是可以删除的；而对于其他分支上而言，我们也可以认为，本题所有用到弱链两端的节点，虽说弱链关系是不同真，但是原本弱链关系是可以同假的，但是这个闭环的话是不存在的，因为思路闭环上并未出现两端同假的状态。换言之，如果任意假设一个弱链关系的两端同为假的话，则一定会推得矛盾。为什么呢？因为能安排如此排布的数字都是一真一假这么交替摆放的（除了 `r1c7` 和 `r4` 这里开头和收尾的两个地方）；当你一旦设其中一个弱链关系两端为假的时候，这里就没办法正常推导，所以导致的矛盾就必然会是诸如 `r4` 三处 6 均无法填数这样的矛盾。

所以，这种思路闭环的删数分为两部分：

1. `r1c7` 这个中转站如果存在除了 6、7、8 外的别的候选数，就都可以删除；
2. 所有弱链关系必定一真一假（不可能同假），因此可以按环的类似形式删数。

这种强制链回环的技巧被我们称为**绽放环**（Blossom Loop）。因为这个删数逻辑（尤其是第二点）使得它在不使用删数分析之前就可以得到，而它可以被论证所有弱链均可删数，所以绽放环就是一种全环。如果使用删数分析也是可以得到全弱链均可用于删数的结论，不过这里就不再赘述了，画表确实也有些费劲。

我们再来看一个例子。

<figure><img src="/files/QjpmVlS7JTb0SVAbzrfw" alt="" width="375"><figcaption><p>绽放环，另一个例子</p></figcaption></figure>

如图所示。这个题也希望你自己推理。

## XYZ 环（XYZ-Loop） <a href="#xyz-loop" id="xyz-loop"></a>

接着我们来介绍一个有趣的技巧。

### 发现删数分析的瑕疵 <a href="#bug-in-analysis" id="bug-in-analysis"></a>

<figure><img src="/files/nztlRtaJ04vKetLFCM4T" alt="" width="375"><figcaption><p>XYZ 全环</p></figcaption></figure>

如图所示。这个环我们先从 `r5c2` 出发推理一下。

首先，`r5c2` 可以走出两个分支 2 和 7。对于 2 而言，我们会走到 `r4c2(2)` 这里为假。然后发现 `2r4c2=2r4c5` 的强链关系，于是走右边，然后到 `r5c4` 最后绕回 `r5c2(5)` 上面来（`r5c2(5)` 此时为假）。而对于走 7 这个分支的话，就会走到 `r1c2` 上，让 `r1c2(2)` 为真，然后绕到 `r4c2(2)` 上来为假，和前一个分支走到这里完全一样，于是归并到一起。

这个环看起来似乎和之前最普通的动态环的思路完全一样，也是起头分支，然后两个分支会汇入同一个节点上，然后往后推，又走回分支上，所以是一个很平凡的动态环。

看起来还挺像那么回事的，是吧？但是这可比之前那个例子强太多了。你可以看到，这个题删这么多的候选数，这可是最开始那个例子所不可企及的地方。但是你肯定会很诧异，同样是分支和汇合，为什么这个例子就能删这么多？

鉴于这个例子的强弱链关系较少（这可比刚才绽放少太多了），我们也来进行一轮弱链删数分析，看看它的删数是怎么来的。

先找出这个环里的所有弱链关系。

| 弱链关系          | 隶属 |
| ------------- | -- |
| `2r4c5-2r5c4` | 主线 |
| `5r5c4-5r5c2` | 主线 |
| `2r1c2-2r4c2` | 分支 |
| `2r5c2-2r4c2` | 分支 |
| `7r5c2-7r1c2` | 分支 |

很好，这个环整体就四个弱链关系。接着，我们试着穷举一下这个题的所有填数情况。

| 情况编号 | 为真的节点                               |
| ---- | ----------------------------------- |
| 1    | r1c2 = 7、r4c2 = 2、r5c2 = 5、r5c4 = 2 |
| 2    | r1c2 = 7、r4c5 = 2、r5c2 = 2、r5c4 = 5 |
| 3    | r1c2 = 2、r4c5 = 2、r5c2 = 7、r5c4 = 5 |

然后看一下弱链两头是否有为真的情况都有哪些。

<table><thead><tr><th width="164.73333740234375">弱链关系</th><th>包含两端其中一端为真的情况编号</th><th>是否可以参与动态环删数</th></tr></thead><tbody><tr><td><code>2r4c5-2r5c4</code> </td><td>1（r5c4 = 2）；2、3（r4c5 = 2）</td><td>⭕</td></tr><tr><td><code>5r5c4-5r5c2</code> </td><td>1（r5c2 = 5）；2、3（r5c4 = 5）</td><td>⭕</td></tr><tr><td><code>2r1c2-2r4c2</code> </td><td>1（r4c2 = 2）；3（r1c2 = 2）</td><td>❌（缺少情况 2）</td></tr><tr><td><code>2r5c2-2r4c2</code></td><td>1（r4c2 = 2）；2（r5c2 = 2）</td><td>❌（缺少情况 3）</td></tr><tr><td><code>7r5c2-7r1c2</code> </td><td>1、2（r1c2 = 7）；3（r5c2 = 7）</td><td>⭕</td></tr></tbody></table>

好了，下面我们就得到了删数的弱链关系有这么 3 个（`2r4c5-2r5c4`、`5r5c4-5r5c2` 和 `7r5c2-7r1c2`），然后就可以开始删数了。

别急！对比例子给的删数，我们发现，似乎这个 `c2` 的所有 2 是可以删的，但在删数分析里我们明确得到了它因为缺少情况所以不能删。这里是我们的思路有哪里不严谨了吗？还是说，弱链删数分析的过程本身就存在瑕疵呢？

### 找出瑕疵的根本原因 <a href="#find-reason-causing-the-bug" id="find-reason-causing-the-bug"></a>

很显然，我们的删数是没有错误的，但是它没有删全，有漏掉的删数。我们可以看到，这两个分支上的、跟 2 有关的这两个弱链关系刚好都在 `c2` 上，而删数恰好也在 `c2` 上，说明这个 2 可能确实是可以用于删数的，但被我们意外地排除掉了。

这就要说一下问题的本质了。我们目的是为了去删这个数，而删这个数的本质是弱链关系肯定有一端为真，对吧？但是，我们似乎漏了一个情况，就是，弱链关系它可以两端都为假，但这一列仍然有 2 的出现，在别的位置上。这是什么意思呢？

我们整体来看 `c2`。我们可以看到，整个结构里是候选数 2，而且还在 `c2` 上的节点一共有 3 个：`r1c2(2)`、`r4c2(2)` 和 `r5c2(2)`，而这三个候选数节点引出了两个弱链关系 `2r1c2-2r4c2` 和 `2r5c2-2r4c2`。比如说，我们针对于来看 `2r1c2-2r4c2` 这个弱链关系。对于这个弱链关系而言，情况 2（填数组合为 `r1c2 = 7, r4c5 = 2, r5c2 = 2, r5c4 = 5` 的情况）会使得这个弱链关系两头都为假。可是，这个情况下的 2，其实是填在了 `r5c2` 上的，而 `r5c2(2)` 是 `c2` 里、整个动态环里用到的另外一个被我们刚好不在这个弱链关系上而忽略掉的位置。同理，对于 `2r5c2-2r4c2` 这个弱链关系而言，我们刚好有情况 3（组合为 `r1c2 = 2, r4c5 = 2, r5c2 = 7, r5c4 = 5`）覆盖不到。而在这个情况下，其实 2 又恰好填在了 `r1c2` 上。所以，总的来说，我们按弱链分析的方式本身会造成瑕疵的根本原因是，弱链关系并不能真正意义上获取到全部的填数状态。

而对于刚才这个题而言，我们要得到 `c2` 的删数，只需要修改一条删数分析的步骤就行：最后多看一下是否这个环里用到的弱链关系有存在同一种数字的弱链关系，且还在同一个区域下的。如果有的话，就还需要增加一步确保这个数字在这个区域是否所有情况都能填入的判断。

### 妥协与解决办法 <a href="#fix-the-analysis-bug" id="fix-the-analysis-bug"></a>

所以，我们找到了解决办法。下面我们针对于删数分析进行完整的步骤演示和描述：

{% stepper %}
{% step %}

### 找弱链关系 <a href="#find-for-weak-inferences" id="find-for-weak-inferences"></a>

观察整个环，找出这个环里全部的弱链关系，然后整理出一张表，用于稍后对照。
{% endstep %}

{% step %}

### 排列填数情况 <a href="#permutation-of-assignments" id="permutation-of-assignments"></a>

对整个环进行填数情况的排列，即为**所有候选数**安排真假性的填数（为真和为假的全部都安排一下，不要遗漏），并确定其中有哪些单元格填了数、填了什么数，最好总结为一张表，用来后续分析。
{% endstep %}

{% step %}

### 确定哪些弱链两端在全部情况下都有一端为真 <a href="#determine-states" id="determine-states"></a>

对每一个弱链关系，都对照第二步的填数组合情况表看一遍，看看是否所有情况下，这个弱链的两端的其中一端有填数。如果确实如此，这这个弱链可以用于删数。
{% endstep %}

{% step %}

### 最终确保数字是否真的能删 <a href="#evaluate-missing-cases" id="evaluate-missing-cases"></a>

当如果并非所有情况下，弱链的两头有一头为真，则不代表它不能用于删数。我们还需要确定这个弱链用到的数字和所在区域，是否还存在其他的弱链关系。如果有的话，我们还需要验证数字是否在这些缺失的情况下，是否是填在了这些地方上。如果能确保数字总能填入到这个区域里，则这个数仍旧可以用于删数；否则，就确实不能删。
{% endstep %}
{% endstepper %}

通过这样的操作，我们就可以完整地完成动态环的删数分析。

哦对，刚才我们看到的这个技巧叫做 **XYZ 环**（XYZ-Loop 或 XYZ-Ring）。从名字里看出，它好像跟 XYZ-Wing 有着些许的关联。实际上确实如此。我们如果把他这么改一下结构的画风，就很像了：

<figure><img src="/files/2iwRgG44flf96SUFdwWN" alt="" width="375"><figcaption><p>XYZ 环，结构画法</p></figcaption></figure>

如图所示。

另外，XYZ 环是全环还是半环呢？看起来似乎是全环。但是，XYZ 环如果按这种结构的画法来看的话，实际上它也可能是半环。我们来看一个 XYZ 半环的例子。

<figure><img src="/files/JVBlUyP7NCjbSkclGBIQ" alt="" width="375"><figcaption><p>XYZ 半环</p></figcaption></figure>

如图所示。这是一个 XYZ 半环的例子。这个半环的删数只有 `r3` 的数字 7 和 `c6` 的数字 1 可以用作删数，别的地方都删不了。如果你确定不了它为什么是半环，可以尝试使用前面提到的过程对这个技巧进行删数分析，不过这里就略了。

### 确定 XYZ 环是半环还是全环的办法 <a href="#determine-whether-an-xyz-loop-is-nice-or-not" id="determine-whether-an-xyz-loop-is-nice-or-not"></a>

我知道你很头疼。虽然看起来似乎都差不多，这不就是在 XYZ-Wing 上搭了一个强链关系么，怎么删数一个是全环一个是半环？

这里教大家一个非常简单的、判断 XYZ 环是半环还是全环的办法，你甚至都不用去画出完整的动态环的强弱链关系就可以直接确定。

XYZ 环从结构上讲，要能形成删数只需要有一个基础的 XYZ-Wing 的结构，然后在 XYZ-Wing 的两个分支（这里是真的分支，XYZ-Wing 讨论的那个分支）上为真的两个数，从外面找一个额外的强链关系，并使得这个强链关系的两头刚好能和这两个数同在一个区域里，就是说能把强链关系给强行连进结构里去。比如说这个半环的例子里 `r3c2(5)` 和 `r9c6(5)` 分别和强链关系的 `r8c2(5)` 和 `r9c1(5)` 相连，属于是牵手成功了。

这样的结构就可以直接称为 XYZ 环了。至于它是半环还是全环，先按半环进行删数即可（因为结构成立，所以它最次都是半环）。而半环的删数有两处，就是 XYZ 环里，这个基础 XYZ-Wing 里不是橘色的（分支上不为真的）那两个数的对应区域。

那么，判断全环的办法就是，看这个我们新加入的强链是否有一端甚至可以和 XYZ-Wing 的拐点（那个三值格）同在一个区域里。如果不在，就不是全环；如果在，就是全环。比如这个题里，强链在 `b7` 里，两个格子很遗憾都跟 `r3c6` 没有任何同行列宫的关联，所以它只能是半环；而对于前面那个全环，强链的其中一端 `r4c2` 就和拐点 `r5c2` 同在一个宫（或者说一个列）里，所以是全环。

全环的删数就厉害了。你能找出来的所有弱链关系全部都能删，所以就不用我重复怎么找这些删数了吧。

好了。至此我们就把动态环的删数逻辑全部介绍完毕了。我想我应该充分地表达了我想表达的内容，下一节我们将看看动态环套用结构的情况。


# 动态区块环的删数分析

Elimination Analysis on Dynamic Grouped Loop

前一节的内容带着各位简单了解了一下动态环的删数模式。本节的内容将继续来看动态环，不过是带有区块节点的，逻辑会更复杂一些。

## 动态区块全环（Dynamic Grouped Continuous Nice Loop） <a href="#dynamic-grouped-continuous-nice-loop" id="dynamic-grouped-continuous-nice-loop"></a>

<figure><img src="/files/CplT6UaIRK2JrbcWtTLo" alt="" width="375"><figcaption><p>动态全环，带待定数组</p></figcaption></figure>

如图所示。这是一个动态环，并使用了待定数组。这个动态环还有待定数组上的删数。

我们按照删数分析的方式走，这个题仍然可以分析。

<table><thead><tr><th width="115.86663818359375">情况编号</th><th>为真的填数</th></tr></thead><tbody><tr><td>1</td><td>r2c2 = 5、r2c8 = 3、r2c9 = 7、r3c6 = 3、r5c1 = 3、r6c2 = 2、r6c7 = 7</td></tr><tr><td>2</td><td>r2c2 = 2、r2c5 = 3、r2c8 = 5、r2c9 = 7、r5c6 = 3、r6c2 = 3、r6c7 = 7</td></tr><tr><td>3</td><td>r2c2 = 2、r2c8 = 5、r2c9 = 3、r3c6 = 3、r4c9 = 7、r5c1 = 3、r6c2 = 7</td></tr></tbody></table>

然后还是老样子，看看是否弱链满足条件。

| 弱链关系           | 两端有一端为真的情况                | 是否可以用于动态环删数 |
| -------------- | ------------------------- | ----------- |
| `3r2c8-3r2c5`  | 1（r2c8 = 3）；2（r2c5 = 3）   | ❓（还需要继续验证）  |
| `3r2c8-3r2c9`  | 1（r2c8 = 3）；3（r2c9 = 3）   | ❓（还需要继续验证）  |
| `3r23c6-3r5c6` | 1、3（r3c6 = 3）；2（r5c6 = 3） | ⭕           |
| `7r2c9-7r4c9`  | 1、2（r2c9 = 7）；3（r4c9 = 7） | ⭕           |
| `7r6c7-7r6c2`  | 1、2（r6c7 = 7）；3（r6c2 = 7） | ⭕           |
| `3r5c1-3r6c2`  | 1、3（r5c1 = 3）；2（r6c2 = 3） | ⭕           |

我们先忽略掉这个待定数组，删不删数都不重要，主要是怕弄混淆。先来看这部分的弱链关系。我们发现，只有前两个弱链关系似乎不能用于删数。但是别忘了，在上一节的内容我们提到，弱链删数分析时，如果遇到弱链在动态环里，出现同数同区的不同弱链时，需要讨论这个数是否真的不能保证里面会出现这个数的情况。刚好，这两个弱链关系均用的数字 3，而且都在 `r2`，所以满足这个讨论的规则。我们继续看。

我们发现，情况 1、情况 2 和情况 3 分别在 `r2c8`、`r2c5` 和 `r2c9` 填了数字 3。因为我们穷举了全部的情况（这个题一共就 3 个情况），我们都发现，似乎这三个情况总能保证 `r2` 里放 3 的需求。所以，3 是可以参与删数的。

另外我们要注意，区块弱链关系 `3r23c6-3r5c6` 在讨论是否两端有一端为真时（尤其说的是 `r23c6(3)` 这个区块节点），需要遵守区块节点为真的规则，即区块节点里的候选数至少有一个为真，那么区块节点为真。可以看出，情况 1 和 3 都能保证 `r3c6 = 3` 的规则。因为 `r3c6(3)` 是这个区块节点的一部分，所以它为真也就可以认为是这个区块节点为真的状态。

反正我们可以看到，所有 6 个弱链关系均可参与删数。

## 讨论结构的可删数性 <a href="#eliminability-of-grouped-patterns" id="eliminability-of-grouped-patterns"></a>

不过别忘了，我们还剩了一个待定数组没有参与讨论。动态环里它是否可以参与删数呢？

答案是肯定的，不过说起来就会显得很复杂。要想证明得到这个结构可以用于删数，我们需要对结构的本体真假性作出严格的讨论，即延伸结构可以用于删数的那些填数。

这个说起来有点绕，其实说的就是待定数组在环里会产生删数的那些额外数字。假设这是一个不带分支的普通的连续环，那你肯定知道，因为待定数组的规则，所有除了强链关系连接的两个数字外，所有其余剩下的无关数字均在这个结构所在的区域上可以删数。那么对于这个题而言，待定数组用到 2、3、5 三种数，其中 2 和 3 参与了强链连接，所以假设它是普通的连续环，那么删数的那个数肯定就是这里的 5 了。那么，我们就需要讨论这个 5 的真假性状态。

刚好，我们在刚才列举情况时，涵盖了 5 的假设填法。我们发现，数字 5 在待定数组里一共有两处位置：`r2c2(5)` 和 `r2c8(5)`。情况 1 是 `r2c2 = 5`，而情况 2 和 3 则是 `r2c8 = 5`。三种情况恰好可以保证 5 肯定可以出现在待定数组的结构之中。所以，5 是可以用于这个动态环的删数的。

也就是说，我们要讨论结构的**可删数性**（Eliminability）时，需要先看结构用于普通连续环时会造成删数的那些位置，进而拓展研究这些位置是否肯定可以占位（所有情况下均存在为真的状态）。如果是的话，那么就可以删；如果不是，则不能。

总之，这个题我们可以看到，普通的环的删数有 `r1c2 <> 2, r2c7 <> 3, r4c1 <> 3, r4c2 <> 23, r6c4 <> 7` 一共 6 个删数；而 `r2c56 <> 5` 则是待定数组在动态环里可删造成的额外删数。

不过，本题还有一个“硬核”删数：`r2c6 <> 3`。这是怎么来的呢？

## 讨论自噬删数 <a href="#eliminability-on-cannibalism-in-grouped-nodes" id="eliminability-on-cannibalism-in-grouped-nodes"></a>

我们发现，在讨论区块节点时，`r23c6(3)` 本身是含了 `r2c6(3)` 这个位置的。但是它可以用作删数，这是怎么来的呢？

还是刚才的那个表。我们发现，所有正常的填数模式下，压根就不涉及 `r2c6 = 3` 的这个填数情况。所有三种情况下，区块节点 `r23c6(3)` 都只填了 `r3c6(3)` 这一个位置。这肯定很奇怪。既然如此，`r2c6(3)` 摆在这里岂不是在“摸鱼”？

实际上我们在排列所有填数情况时早已知道 `r2c6 = 3` 是不存在的填法，不然表格里就肯定会有它的身影。对于不存在的填法，直接删除它是正确的，也是合理的做法。如果你理解不了这一点，我们就尝试故意填入 `r2c6 = 3` 然后看看是不是不可能。

当我们假设了之后会直接发现，按照动态环的路径进行的话，待定数组里 `r2c2 = 2`、分支上 `r5c1 = 3`、右下角的分支会得到 `r6c7 = 7`。这三个单元格会同时造成分支汇入的单元格 `r6c2` 直接无法填入任何数字，直接就矛盾了。因此，`r2c6 = 3` 根本就不可能存在。

是的，这还存在一个非常隐蔽的删数 `r2c6 <> 3`。

如果你觉得这还不够优雅，那么我们就回到弱链删数分析上来。我们可以看到，`r2c8(3)` 和 `r2c9(3)` 是有弱链关系的，而它可以用于删数（之前已经证明过了）。所以，`r2c6(3)` 是属于这个弱链可以删数的范畴的，因为这个弱链关系只用了 `r2c89` 这两个单元格，并未用到 `r2c6`，即使它是别的分支上的一个节点里的一部分。所以，从这个角度来说，它仍然可以用来删数。

总而言之，我们不论哪种理解角度，这个数都可以用于删数。所以，`r2c6(3)` 是这个结构里的一个删数。因此，本题的删数一共有 9 个。

## 留给各位一个题目 <a href="#the-last-puzzle-in-this-passage" id="the-last-puzzle-in-this-passage"></a>

最后给各位一个动态环的例子，它带有一个区块节点和一个毛刺数组。

<figure><img src="/files/0VL9Jh9hKydpLcXG5nJu" alt="" width="375"><figcaption><p>动态区块半环</p></figcaption></figure>

如图所示。这是一个**动态区块半环**（Dynamic Grouped Continuous Loop）。至于原因嘛，就自己分析了吧。这个题就相当于留个作业了。

至此，我们就完成了链理论的内容的学习。下一篇我们将进入到包装和构造类技巧的学习中来。下面为各位展示一下目前我们学到的链的全部分类。

<figure><img src="/files/6fEY1S9Sj01u8EoKJC7x" alt=""><figcaption><p>链理论（截至动态链部分）</p></figcaption></figure>


# 染色法

Coloring

欢迎来到新的板块内容。接下来我们会连续给各位介绍两个新内容：**包装**（Wrapping）和**构造**（Construction）。包装指的是将逻辑和过程用一些新概念包装一层，然后推理的新技巧类型；而构造则是把已有的技巧的规则加以推广，利用一些可以复合使用的过程参与叠加的新技巧类型。

按照难度和板块编排的优先级，我们先学习包装技巧。包装技巧只有两个，所以比较轻松。


# 同数染色

X-Coloring

我们先来学习第一个技巧：**染色法**（Coloring）。染色法也叫**涂色法**，指的是将盘面一些候选数按照规范进行不同配色的染色，然后通过颜色的填充来证明矛盾状态的一种数独技巧。

这种技巧的本质是利用图论知识点的染色法派生得来的数独技巧，它的学习难度不高，也不需要专业的图论知识点来解释它，而且它只会依赖一个概念就可以运作起来。这个概念早在之前唯一矩形里就提到过，那便是共轭对。

这种染色技巧和链理论比较类似，也分为同数的和异数的版本。同数的版本称为**同数染色**（X-Coloring）。我们先来看这个部分的内容。

## 同数染色 Trap 模式 <a href="#color-trap" id="color-trap"></a>

<figure><img src="/files/kRO3DOVPOQJRgK9pcih6" alt="" width="375"><figcaption><p>Color Trap</p></figcaption></figure>

如图所示。我们找出这个盘面关于数字 1 的所有共轭对，然后将它们串起来。这个题里还有一些别的位置可能也存在共轭对（如 `r6` 的数字 1 也可以构成共轭对），但我们只保留了图中这一部分，这一部分可以只使用共轭对就可以串起来；而 `r6` 这一行上两个单元格需要串起来到图中的结构里是不行的，因为 `r4c4` 和 `r6c6` 不是共轭对，无法按共轭对串起来。

我们串起来的共轭对序列因为任意相邻的两个节点一定是互斥的填数状态（一边真，另一边就是假），于是我们尝试给他们用两种不同的颜色区分开来，我们就会得到图中这两种配色。其中，所有绿色的候选数同真假性，所有蓝色的同真假性，绿色和蓝色的真假性相反。

然后，我们就会发现矛盾的点，我们可以看到，因为 `r2c6` 是绿色，`r3c9` 是蓝色，所以 `r2c78` 就无法填 1 了。如果这两个单元格的其中一个位置填了 1，就会同时造成 `r2c6` 和 `r3c9` 都无法填 1。因为共轭对的关系，一边不填就会造成另外一边填入。而 `r2c6` 所在的共轭对连接的是蓝色，`r3c9` 所在的共轭对连接的是绿色，这两种颜色不同，也就意味着他们的真假性不一样。真假性不一样是不可能同真的，所以就矛盾了。

当然，你也可以尝试确凿地往 `r2c78` 的其中一个格子里填入 1，然后你就会得到矛盾——`c5` 会填两个 1，但是这两个单元格在同一个列是不能填两个 1 的。同理，`r3c23` 也不能填 1，因为他们处于 `r1c3` 和 `r3c9` 的交集上：

<figure><img src="/files/dRdrtPzBFWfZNcHOJAZv" alt="" width="375"><figcaption><p>Color Trap，另外一边</p></figcaption></figure>

如图所示。

我们把这个技巧称为 **Color Trap**。这个技巧暂时没有中文名，早期翻译为“色链法”。

## 同数染色 Wrap 模式 <a href="#color-wrap" id="color-wrap"></a>

下面我们再来看一个用法。

<figure><img src="/files/vQy5HaSidHud8nBzNW73" alt="" width="375"><figcaption><p>Color Wrap</p></figcaption></figure>

如图所示。我们这次也一样地找出所有共轭对，然后按共轭对把他们全部串起来。同一种颜色真假性一样，不同的颜色真假性不同。

可以看到，在共轭对全部找出之后，红色这一组显然存在矛盾：红色这一组 `r2c1` 和 `r3c2` 染色一样，但在同一个宫。因为真假性相同，但在同一个宫里本身也不能填入重复数字，所以同真假性的红色只能是同假的状态，而不能是同真的状态，所以，所有红色的全部同假，也就意味着本题所有红色的候选数均可删除。

我们把这个技巧称为 **Color Wrap**。这个技巧也没有中文名，早期翻译为“色分法”。

## 同数复染色 <a href="#multi-coloring" id="multi-coloring"></a>

前面介绍的是，将全部共轭对串起来成一个大结构的用法。下面我们来看共轭对无法串起来成一个结构，而需要至少两个结构的时候，是怎么推理的。

<figure><img src="/files/tO3L1qSMtD6x3pvxSgZS" alt="" width="375"><figcaption><p>Multiple Coloring</p></figcaption></figure>

如图所示。本题有两组共轭对可以串起来，但是因为 `b3` 这里并不是共轭对，所以不能串成一组大的结构，只能暂时这样了。

既然不能串起来，我们就只好分情况进行讨论。

* 如果绿色的 1 为真，则 `r5c23 <> 1` 可以得到，因为此时 `r4c3(1)` 为真；
* 如果蓝色的 1 为真，则橘色的 1 为假，于是只有可能紫色的 1 为真，这样也可以得到 `r5c23 <> 1` 的结论。

因为排除的关系，当蓝色为真时，很容易通过 `b3` 得到 `r2c9(1)` 为假的结论。而 `c9` 恰好又有共轭对用了 `r2c9(1)`，进而可以将“蓝色的真假性和紫色的真假性相同”绑定起来。

我们把这种无法并起来，但可以通过简易关联的方式也可以得到删数的逻辑称为**同数复染色**（简称**复染色**，Multiple Coloring 或 Multi-Coloring）。

## 染色法和链理论 <a href="#coloring-vs-chain-theory" id="coloring-vs-chain-theory"></a>

染色法是早期尚未体系化链理论之前就有的一种数独技巧，因为它方便快捷，只用到共轭对就可以找到删数，所以非常好用。

不过可以看出，其实染色法在一定程度上是跟链（尤其是同数链）非常类似。我们只需要把前面的这些画法稍加改动，就可以得到链的等价画法，照样可以删除这些删数。因为共轭对在链理论里一般用于表达强链关系，所以这个技巧都可以转为链的画法。


# 异数染色

3D Medusa

之前我们学到了染色法的基本推理过程。下面我们来看，将共轭对继续推广到异数之间的强链关系（双值格），看看是否可以得到一些新东西呢？

## 异数染色 Trap 模式 <a href="#id-3d-medusa-coloring-trap" id="id-3d-medusa-coloring-trap"></a>

<figure><img src="/files/Z19gYW7XuFzOtvo8tAoV" alt="" width="375"><figcaption><p>同数，不同颜色</p></figcaption></figure>

如图所示。因为套路和之前找共轭对的方式一样，所以共轭对的线条就不画了。只是这次会多出双值格的延伸方向，不单单是看共轭对了。比如说 `r1c5` 和 `r1c8` 的数字 5 是共轭对，然后 `r1c8` 是双值格，于是延伸方向还可以从 5 转到 8，然后 8 在 `c8` 又有共轭对，于是继续延伸。

可以看到，这么延伸可以拓展出来这样的结构。我们不难发现，`r3c5` 和 `r5c5` 都涂了 3，但是颜色不同，一个是绿色的一个是蓝色的。因为延伸方向代表了真假性的交替，所以不同颜色仍然表示的是不同的真假性。因此，`r9c5` 是不能填 3 的，参考 Color Trap 的逻辑可以知道，填了会造成不同染色的数字具有相同的真假性，就矛盾了。同理，`r3c5` 和 `r6c7` 的数字 3 也具有不同的染色，所以 `r3c7 <> 3`。

这次我们延伸了双值格的方向，产生了不同颜色的染色，我们把这种染色统称为**异数染色**（3D Medusa Coloring）。这是第一种用法，即利用同数字的不同染色的删数模式，跟 Color Trap 的思路一样。

异数染色的英文名 3D Medusa 直译过来是三维的美杜莎的意思。想象一下，美杜莎的头发上的蛇就是一个一个的这样的分支。这技巧也长这样，是不是怪可怕的？

## 异数染色 Wrap 模式 <a href="#id-3d-medusa-coloring-wrap" id="id-3d-medusa-coloring-wrap"></a>

下面我们来看异数的情况。

<figure><img src="/files/FzgkorADybz87L3OfLCk" alt="" width="375"><figcaption><p>异数，相同颜色</p></figcaption></figure>

如图所示。我们也按照刚才的方式进行染色。然后我们会发现异常情况：染色是红的这一边，会在同一个单元格有相同的染色。因为同一个颜色是相同的真假性，而同一个单元格显然不能同为真，因此只能同为假。所以，所有红色的这一组是这个题目的删数。

这个类似于之前学到的 Color Wrap 的删数模式。

这样我们就完成了异数染色的内容的介绍。看完了这两篇内容，是不是觉得这个技巧也蛮简单的？


# 代数法

Baba Grouping

欢迎来到新的技巧。这个技巧其实早在之前欠一数组、烟花数组等技巧里有所使用，不过并未将它的一些本质处理纳入介绍，这里开始介绍这个技巧的实际用法。

## 代数同步（Baba Grouping Sync） <a href="#baba-grouping" id="baba-grouping"></a>

<figure><img src="/files/c9JQEc1FaOsUbjw1oCck" alt="" width="375"><figcaption><p>代数法，第一轮假设</p></figcaption></figure>

如图所示。当我们无从下手时，我们不妨先假设一个填数。但是这次，我们代入变量求解。

假设 `r5c5` 填 $$a$$，并假设 `r1c5` 和 `r3c5` 分别填 $$b$$ 和 $$c$$，我们就可以根据 `b3` 的宫排除得到 `r3c8` 填 $$b$$（用 `r1c5` 排除就行）。此时 $$abc$$ 三个字母均不相同，但一定都是 2、8、9 里的数字。

当我们得到 `r3c8` 填 $$b$$ 之后，我们就可以在行里得到剩下的那个位置 `r3c3` 只可能填 $$a$$。此时结合最初假设 `r5c5` 填的 $$a$$，对 `b4` 作宫排除可以得到，`r46c2` 的其中一个单元格肯定会填 $$a$$。再次结合 `r3c8` 的 $$a$$，我们可以得到 `b7` 的宫排除，得到 `r9c1` 此时填 $$a$$ 的结论。

<figure><img src="/files/kPR02vMluWBAbrB001MO" alt="" width="375"><figcaption><p>代数法，第二轮假设</p></figcaption></figure>

如图所示。在我们得到前面 `r9c1` 填 $$a$$ 的结果后，我们无法继续了。此时我们需要第二轮的假设。

我们发现 `r9c6` 此时也只有 2、8、9，那么我们继续复用字母进行假设。但是为了确保这一轮的假设和前一轮没有直接关联，我们换成大写以区分。这次假设 `r9c6` 填 $$B$$，于是我们对 `b7` 作宫排除，可以得到 $$B$$ 只能填在 `r78c2` 里，于是构成区块。得到区块后，我们可以知道 `b1` 里 $$B$$ 只能填在 `r2c1`。可能你会问我，这不是可以填在 $$a$$ 所在的 `r3c3` 么？其实不行。因为我们可以从 `r9` 看出，在假设 `r9c6` 填 $$B$$ 的时候，我们已经知道已经有 $$B \neq a$$ 了。所以，`r3c3` 此时是勺填 $$B$$ 的。

接着，既然 $$B$$ 知道填在 `r2c1` 里，那么剩下一个格子就填 $$C$$ 吧；同时，观察 `c1` 我们可以得到 $$C$$ 可以填在剩下的 `r5c1` 上。这样整个 `c1` 的空格填数就假设全了。

借用 `r5c1` 来看 `r5` 这一行。可以看到，此时 `r9c6` 填的是 $$B$$，它会使得 `r5c6` 不填 $$B$$。而 $$B \neq a$$ 而且  $$B \neq C$$，所以 $$B$$ 只能“被迫”填在最后剩下的空格 `r5c9` 上。这便是这个题的结论：因为 `r5c9` 还含有候选数 4，所以 `r5c9` 肯定不能填 4，因为最终我们确定了它填的是 $$B$$，而 $$B$$ 在最初第二轮假设的起始就知道它只能是 2、8、9 的其一，所以 4 肯定不可能。因此，本题的结论就是 `r5c9 <> 4` 了；当然，你也可以认为本题的结论是 `r5c6 = 4`，因为这个单元格不能填 $$aBC$$ 三种数，而他们之间互不相同，又刚好是 2、8、9 三种数字里的数，所以 `r5c6 <> 289`。

我们把这种利用假设字母的方式推演得到删数或出数结论的技巧称为**代数法**（Baba Grouping）；而因为它的名称和“袋鼠”谐音，所以这个技巧也经常被戏称为“袋鼠法”。而本题的推演过程是代数法的其中一种用法：通过假设字母来直接得到某个单元格也填字母里的数，但它因为包含别的候选数，所以应该删除他们。这种用法被称为**代数同步**（Baba Grouping Sync）。

## 代数法的技巧名的由来 <a href="#naming-history" id="naming-history"></a>

这个技巧早在二十年前的二零零几年，在外国论坛里就已经出现，不过最早的出处确实记不得从哪里发出的了，是谁发的也无从知晓，甚至当时的包装也很简陋，说它不是代数思想都行。但是在中国，这个技巧在几年后被一位年轻人独立发现和挖掘出来。这个人叫邱言哲。

这个人就厉害了，他是国家队级别的人物，参加过许多国际数独相关的赛事，也拿到了不少奖；同时，他本人也对一些难度较高的数独技巧有兴趣，也经常做研究。对于大赛而言，其实比赛的难度并不算高，主要还是考虑比赛时长的关系，主要考验的还是玩家选手的能力和掌握的扎实功底和灵活运用。

不过，这个人将这个技巧取名为“代数”，不过没有给予这个技巧一个合适的英文名。因为在英语里，和代数这个说法最接近的是 algebra。不过，这个单词是数学上的代数科目，是一门课程。从课程研究的内容和学习的知识点来看，algebra 和这里数独技巧里的代数并不是同一个东西，也确实相差甚远。所以，英文名取名上就比较犯难了。我也有咨询过邱言哲本人，不过他的意见是“不好说”。从恰当的翻译来看，algebra 确实差得很远，因此本教程不采用这个翻译。

你可以从技巧名称里看到，我把这个技巧称为 baba grouping。看起来这似乎跟技巧的翻译压根不沾边，grouping 是分组的意思，但 baba 这个单词就显得更加不知所云。

实际上，baba 来自于一款推箱子类型的解谜游戏。原游戏的名称叫 Baba Is You。这个游戏的内容界面长这样：

<figure><img src="/files/lqtYmbZrfnkPMgqtjyXa" alt=""><figcaption><p>Baba Is You 游戏界面（其中一个关卡）</p></figcaption></figure>

如图所示。玩家需要操控图中白色的角色（这角色就叫 baba）进行上下左右移动。通过推动字母块来控制单词序列的组合、顺序或内容，以直接纂改游戏规则的关卡制解谜游戏。

> 在游戏里，单词 group 具有的特性是，控制一组游戏里的物件（包括角色本体）在激活了“<物件> is group”状态的角色全部启用指定的特征。其特征采用“group is <特征>”的方式激活。如本游戏里的单词 you 表示玩家可以操控的角色。如果是 baba is you，那么操控的角色就是 baba，你可以通过键盘上下左右移动 baba 角色；如果是 flower is you，那么你可以控制的物件就从 baba 改为花朵；其他同理。本图里 baba is group 指的是 baba 属于 group 小组里的内容；而 group is you 表示所有用 is group 组合过的物件都可以受玩家控制移动。

可以看出，游戏里采用 group 来表示角色分组状态，这和代数法将选取的数字按字母分组进行推理的过程如出一辙，所以最终我把这个技巧称为 baba grouping，即按候选数为物件分组推理的逻辑。

## 代数数组（Baba Grouping Subset） <a href="#baba-grouping-subset" id="baba-grouping-subset"></a>

<figure><img src="/files/fdQYFU9UgIT8zyM4wNu0" alt="" width="375"><figcaption><p>代数数组，前半部分</p></figcaption></figure>

如图所示。我们先假设 `c4` 的两个空格分别填 $$a$$ 和 $$b$$，然后观察 `b2` 可以得到剩下两个单元格的填数是 $$b$$ 和 $$c$$。不过，这里显然不需要把 6 用字母进行假设，所以不妨就用 6 表示实际填数，即 `r2c56` 是关于 6 和 $$b$$ 的数组，于是可得 `r2c2` 填 $$a$$。

<figure><img src="/files/I5UnZquCC3289J6tvyp3" alt="" width="375"><figcaption><p>代数数组，后半部分</p></figcaption></figure>

如图所示。可以看到，当我假设了 `r2c2` 填 $$a$$ 之后，事情变得了有趣了起来：此时 `b7` 里 $$a$$ 只能填在 `r9c13` 之中，所以构成区块。然后，我们可以得到 `b8` 里填 $$a$$ 的位置只能在 `r7c5` 上。

不过，因为 `r7c4` 是 $$b$$，所以这三个单元格里还剩下一个填的数字是什么呢？6。因为我们故意把 6 拿出来不参与字母的假设，就是为了这里使用。我们知道 $$a$$ 和 $$b$$ 此时是 3、6、9 的其二，且不相同，但这么做我们无法继续推理。所以把 6 搁出去，本质目的是为了让 $$a$$ 和 $$b$$ 此时不能是 6，而只能是 3 或 9。所以，6 理所应当填在 `r9c6` 里。这便是这个题的结论。

把这个地方把 6 搁出去的行为并不算是罕见；不过这种用法往往会搭配例如图中这种数组的形式。我们把这种用法称为**代数数组**（Baba Grouping Subset）。

## 代数占位（Baba Grouping Occupancy） <a href="#baba-grouping-occupancy" id="baba-grouping-occupancy"></a>

<figure><img src="/files/G4VZRpwgweVrUkM3dwAR" alt="" width="375"><figcaption><p>代数占位，前半部分</p></figcaption></figure>

如图所示。假设 `r1c2` 填 $$a$$、`r7c2` 填 $$b$$ 以及 `r9c2` 填 $$c$$，于是 `r8c3` 填 $$a$$。与此同时，观察 `r2` 可以发现，此时 $$a$$ 只能填在 `r2c6`，因为剩下两个单元格 `r2c13` 都和初始假设了 $$a$$ 的单元格 `r1c2` 在同一个宫里，不能重复填了。

既然如此，我们就可以利用 `r2c6` 和 `r8c3` 假设的 $$a$$，对 `b8` 作宫排除，就可以得到 `r9c5` 填 $$a$$。于是，根据假设的字母，我们可以得到 $$b$$ 在 `b8` 里只能填在 `r8c4` 里，而 $$c$$ 就只能在 `r7c6` 里了。

<figure><img src="/files/L7gVf09fwzKtSlhAME9c" alt="" width="375"><figcaption><p>代数占位，后半部分</p></figcaption></figure>

如图所示。这里有一个非常神奇的地方。因为我们知道 `r8c4` 填 $$b$$，所以根据排除我们可以得到 $$b$$ 的位置在 `b2` 里填在……等会儿？！没空位了！是不是题做错了？

别紧张。这里没有问题。我们发现似乎 $$b$$ 排除掉 `r13c4` 之后，没有任何空格可以填 $$b$$。但是，别忘了 $$b$$ 应该可填的数字种类。在假设 $$abc$$ 的时候，他们均为 1、4、7 里的数字。而 `b2` 里并未直接给出空位填 1、4、7，但它却有一个破题点，`r3c5` 这个提示数 4。

因为 $$b$$ 在 `b2` 里显然不填在 `r13c4` 之中，而剩余的空格 `r2c6` 也填的不是 $$b$$，所以 $$b$$ 此时落在哪里似乎都不可取。但是别忘了它是 1、4、7 的其中一个数。在 `b2` 里，1、4、7 里就只有 4 以提示数形式存在。但凡它不给提示数是 1、4、7 里的数，都不会有合理的结论形成；但是有一个 4，反而给我们了一个推出结论的机会，即 $$b = 4$$，因为此时 $$b$$ 要填在 `b2` 里，这是唯一合理的填数位置。

既然我们知道 $$b=4$$ 了，那么我们自然就知道本题里所有假设位置上是 $$b$$ 的单元格都应该填上 4，这便是这个题的结论。我们把这个用法称为**代数占位**（Baba Grouping Occupancy），表明最终得到的结论是让其中一个字母等于明数里的一个数，即非空格里的一个数字。另外，这题 `r9c9` 如果填了 $$b$$ 的字母假设的话，它也可以得到结论，不过本题没标注是因为推理过程上用不到这个格子。如果你标了 $$b$$  的话，其实也可以得到 4 的出数。

这便是代数，一种非常神奇的假设推理模式。它不同于链，它的假设更为模糊地使用了字母表示了一种填数模式，但它仍然可以得到一些非常合理的结论。

## 为什么这个技巧能奏效？ <a href="#why-this-technique-works" id="why-this-technique-works"></a>

如果你初学这种思路，可能很想想明白为什么用代数的方式可以得到合理的结论，并且还是正确的。

从底层角度来说，假设字母其实等效于将多种填数模式归类为同一个。我们拿最开始那个题举例说明。

<figure><img src="/files/c9JQEc1FaOsUbjw1oCck" alt="" width="375"><figcaption><p>还是之前那个代数同步的题</p></figcaption></figure>

如图所示。这是之前那个代数同步的题。

从本质来看，我们在假设的过程之中并未使用数字的真假性在讨论填数。但如果非要讨论的话，我们也有办法，不过得分两种情况：排除模式和唯一余数模式。

我们前面的三种代数思路里，使用了众多不同的推导过程，但是万变不离其宗，总体还是各种行列宫排除，以及唯一余数在对格子填数下结论。之所以按排除和唯一余数来分，是因为他们的假设方式不同。

从排除来看，比如这个题里初始假设的是 `c5` 的三个单元格。而其中假设了 `r1c5` 填 $$b$$ 则可得到 `r3c8` 填 $$b$$，这一步是宫排除得到的。但如果你要看真假性的话，我们不妨来看看这个单元格都有什么数。`r1c5` 只有两个候选数：2 和 8。当 $$b = 2$$ 时，数字 2 可以通过宫排除，得到 `b3` 填入 2 的位置只能落在 `r3c8` 里；同理，我们再次假设 $$b = 8$$ 的时候，也同样有 8 只能填在 `r3c8` 的结论。

因为初始假设的 $$b$$ 仅有这两种填数情况，而最终 `r3c8` 也只会有映射过来的两种填数结论，并且是一一对应的，所以我们也可以认为，`r3c8` 和 `r1c5` 从答案来看，他们俩应该就是填的一样的数字。

再来看唯一余数。唯一余数借助的是行列宫里完整的一组字母假设。因为我们初始假设字母的使用时默认了不同字母表示不同数字的方式，因此小写的 $$abc$$ 摆在 `r3` 同一行上显然不可能填有完全一样的数字。比如我们假设了 $$b$$ 和 $$c$$ 分别在 `r13c5` 里的时候，就默认了 $$b \neq c$$ 的信息是成立的；而刚才我们知道 `r3c8` 是 $$b$$，刚好 `r3` 也就三个空格位置，其中俩都安排了 $$b$$ 和 $$c$$ 了，那还剩下一个字母没用，自然就是 $$a$$ 了。而 `c5` 里我们知道，`r5c5` 是假设为 $$a$$ 的，所以此时我们可以认定 `r3c3` 和 `r5c5` 也是完全相同的填数。这样就把两个完全不相关的单元格用等式关联起来了。

所以本质上来看，其实这个技巧就只有排除和唯一余数两种操作在被反复利用。它当然可以很复杂，比如这个例子后续还有大写字母假设加入其中，但我们知道两个阶段的推理只有 $$a$$ 是关联的，其他字母已经毫不相干了，但最终我们也可以得到合理的结论，正是因为排除和唯一余数在替我们“砥砺前行”。

当然，我们这里要说清楚一个点。

<figure><img src="/files/kPR02vMluWBAbrB001MO" alt="" width="375"><figcaption><p>还是之前代数同步的例子，不过是第二轮假设字母</p></figcaption></figure>

如图所示。这一轮的假设我们用到了大写字母，主要目的是为了和小写字母区分开来，但是实际上他们也都填的还是 2、8、9 里的数字。之所以没有换成 $$x$$、$$y$$ 这种小写字母，主要是觉得不同的小写字母会起到一个他们之间互不相同的效果，但这里大写字母的 $$B$$ 和 $$C$$ 仍然填的是 2、8、9 里的数字，只是和原始小写字母的假设关系不大。

正是因为关系不大，所以就不要贸然去认为 $$b=B$$ 或者 $$c=C$$ 这样的结论。实际上是不成立的，因为本题仅凭这样的推理，是得不到这样的结论的。

## 全盘代数 <a href="#baba-grouping-using-all-cells" id="baba-grouping-using-all-cells"></a>

最后我想给各位展示一个炫技一般的操作：全盘代数。鉴于它的长相比较恐怖，所以先给各位看下原题的候选数分布。

<figure><img src="/files/hJUOlYfoR6jrVfu24BsH" alt="" width="375"><figcaption><p>全盘代数，原题</p></figcaption></figure>

然后是这个题的代数法技巧的使用。

<figure><img src="/files/PDB3A5wvB41WBUQE3m2g" alt="" width="375"><figcaption><p>全盘代数</p></figcaption></figure>

如图所示。这个我实在是不打算解释了。总之就是先假设一连三个空位的字母分别是 $$abc$$，然后根据前面描述的一些技巧推演可以得到整个盘面的出数。然后因为出数信息里含有额外的数字，所以可以得到一些位置的出数一定的某个数字，进而将全盘推算出来的“神技”。

虽然这看起来非常离谱，但是这更类似于在广义层面地试数，所以最好还是不要这么用。

## 总结 <a href="#conclusion" id="conclusion"></a>

代数的思想确实非常巧妙，但它也有一定的局限性。比如它过多依赖候选数非常相似的题目，比如这样图中 2、8、9 众多还不含其他候选数的情况。比如说这个题里，如果 `r1c5` 不止有 2、8、9，那么假设可能就无法继续了。所以它对候选数要求比较高，在一些题作为收尾和卡点破题的地方会非常好用，但在难题里一般只会提供用于证明一些结论，很难发挥出不错的效果，因此不要过度依赖这个技巧的推理过程。

至此我们就把代数和染色这两种包装技巧介绍完了。下一节的内容将会讲解构造的相关内容。


# 唯一矩形构造

Unique Rectangle Construction

欢迎来到新的板块。包装的部分已经结束了，这是第二部分。

所谓构造，指的是玩家可以通过前面学到的技巧加以组合，构成新的推理思路。也就是说，你可以在不学习新的技巧的推理过程之前，就可以先对前面的技巧进行灵活使用，构造出来新的技巧推理形式。

这样的用法还不少，尤其是在链里的使用非常繁多，在之前的教程里，构造的内容都是放在链里说的；这次我们把他抽取出来，单独形成一个板块。

先来说结构构造。所谓结构构造，就是构造的逻辑只涉及前文里非链的内容的技巧进行组合使用的模式。但是这种使用逻辑在之前我们学到的技巧里只有唯一矩形这个技巧不太“常规”，所以就让它来作为我们切入构造推理的敲门砖吧。


# 唯一矩形的结构构造

Unique Rectangle Pattern-Based Construction

在之前的内容里，我们知道唯一矩形是第一个和普通数独技巧不同的候选数技巧，因为它利用了数独必须有唯一解的特殊规则。正是因为使用的规则和基础规则有所不同，所以天生造就了这个技巧可以搭配其他的用法。

## 唯一矩形 + XY-Wing <a href="#unique-rectangle-xy-wing" id="unique-rectangle-xy-wing"></a>

<figure><img src="/files/QWg9ljIGWavy2vgzSKWC" alt="" width="375"><figcaption><p>唯一矩形 + XY-Wing</p></figcaption></figure>

如图所示。请关注 `r23c24` 四个单元格。显然，如果 `r2c4(3)` 和 `r3c2(7)` 同为假的话，四个单元格将只剩下 4 和 5，就会形成矛盾。因此，这两个数至少有一个为真。那么：

* 当 `r2c4 = 3` 时，`r1c6 = 8`；
* 当 `r3c2 = 7` 时，`r3c3 = 8`。

我们分析可得，`r1c6(8)` 和 `r3c3(8)` 至少有一个为真。所以，`r1c1` 和 `r3c5` 就没有机会填 8 了；否则它会同时使得 `r1c6` 和 `r3c3` 都无法填入 8 导致矛盾。

可以发现，这一次我们搭配了唯一矩形外部的两个额外的双值格。倘若我们将 `r2c4(3)` 和 `r3c2(7)` 看成是分支，那么它就是一个完美的 XY-Wing。这便是它的其中一种常见构造：搭配 XY-Wing。

> 在构造里，因为两个技巧可以搭配使用，所以它的组合方式是根本穷举不完的，太多了。所以，这样的组合技巧没有一个实质性的命名标准，就像是之前在直观技巧里使用的复杂出数技巧一样。那个也是构造，基于直观技巧的构造。这里非要给它定义一个名称的话，可以直接将其用加号相连，比如这里的“唯一矩形 + XY-Wing”。

## 唯一矩形 + XYZ-Wing <a href="#unique-rectangle-xyz-wing" id="unique-rectangle-xyz-wing"></a>

像是这样的技巧，其实并不少见。下面我们来看一个搭配 XYZ-Wing 的例子。

<figure><img src="/files/RY24B3OMbPGvrO8fgcFK" alt="" width="375"><figcaption><p>唯一矩形 + XYZ-Wing</p></figcaption></figure>

如图所示。这次会存在三个分支：`r2c8(8)`、`r5c8(1)` 和 `r5c8(4)`。这里的过程就省略了，删数比较好推理，就自己看了。要注意本题其实缺少了一个候选数 2，但是残缺的唯一矩形是可以使用的，这一点早在之前就说过了，这里就不重复了。

## 唯一矩形 + WXYZ-Wing <a href="#unique-rectangle-wxyz-wing" id="unique-rectangle-wxyz-wing"></a>

<figure><img src="/files/XiA94zkyruJE4cMKcN6e" alt="" width="375"><figcaption><p>唯一矩形 + WXYZ-Wing</p></figcaption></figure>

如图所示。这个题虽然也不难，但候选数非常多，看起来很复杂，所以带着各位来看一下。

首先是关注于 `r58c89`。这四个单元格里如果没有橘色的 2、3、4、8 四种数字（一共有四种数，但有 6 个候选数的位置）的话，则数字 5 和 7 在这四个单元格将构成唯一矩形的矛盾。所以，这些候选数里至少有一个为真。

然后，我们需要将 2、3、4、8 按数字种类分组，即分为四组，并分组讨论填数模式：

* 如果 `r8c8(2)` 为真，则 `r8c4 = 5`；
* 如果 `r8c89(3)` 为真，则区块成立，可得 `r7c9 = 5`；
* 如果 `r8c89(4)` 为真，则区块成立，可得 `r9c7 = 5`；
* 如果 `r8c8(8)` 为真，则 `r7c7 = 5`。

可以看到，分组后，我们仍然可以得到填 5 的通用结论，不过这次有四个分支。所以我们只能保证这四个分支的末端其中至少有一个填 5。

所以，这个题的结论就是删四个 5 的交集的删数，即本题的 `r8c9 <> 5`。

## 唯一矩形 + 融合待定数组 <a href="#unique-rectangle-sue-de-coq" id="unique-rectangle-sue-de-coq"></a>

<figure><img src="/files/d2mu1V1XXzeW61rftL5C" alt="" width="375"><figcaption><p>唯一矩形 + 融合待定数组</p></figcaption></figure>

如图所示。这次我们搭配融合待定数组，看看有什么特殊效果。

请关注 `r27c23` 四个单元格。这四个单元格如果没有 `r2c23(67)` 的话，四个单元格将构成关于 2 和 3 的唯一矩形的矛盾形式，所以这四个候选数里肯定至少有一个为真。

既然如此，我们就可以搭配 `b2` 的一些单元格构成融合待定数组。这怎么构成呢？我们选取 `r13c5` 和 `r2c46` 四个单元格。这四个单元格里有 2、3、5、6、7 五种数字，其中 6 和 7 可以和唯一矩形用到的格子 `r2c23` 搭配，而剩下的数字 2、3、5 则不用管，他们自己成一组。

可以看到，结构里 2、3、5 确实只出现在 `b2` 里，这意味着 2、3、5 是不可能填两次的，结构里最多只能填一次；而对于数字 6 和 7 而言，因为他们也只能填在 `r2` 上，所以也都只能填最多一次。

数一下单元格的数量。算上 `r2c23`，整个融合待定数组用了 6 个单元格；数一下数字种类数，用到的数字有 2、3、5 和 6、7，一共有 5 种数字。不对啊。这不是不相等么？

是的，但是别忘了唯一矩形的效果。`r2c23` 里实际上只能最多有一个单元格填 6 或者 7，否则 `r2c46` 就只剩 2 和 5 了，再看 `b2` 里的这四个单元格，全都只剩 2、3、5，这肯定填不下的。

与其说最多有一个格子填，不如说恰好有一个格子填。因为 `r2c23` 也都不能都不是 6 和 7，否则唯一矩形矛盾了不是。所以，这两个单元格数量上虽然是两个，但是算只能算一个到结构里，所以结构里仍旧只有 5 个单元格。因此，融合待定数组是成立的。

结论呢？结论自然就是 `r2` 其余单元格不能填 6 和 7，而 `b2` 的其余单元格不能填 2、3、5 嘛。所以本题的删数有 `r13c6 <> 25, r2c9 <> 6`，共有 5 个删数。

## 唯一矩形 + ALS-XZ <a href="#unique-rectangle-als-xz" id="unique-rectangle-als-xz"></a>

唯一矩形除了可以搭配基础的技巧外，还可以根据需要搭配一些非常离谱的东西。这是整个教程里我唯一一个不想反复重复它中文名的技巧，太他么长了……

<figure><img src="/files/QC75uOj4YSJ1CXqauBFG" alt="" width="375"><figcaption><p>唯一矩形 + ALS-XZ</p></figcaption></figure>

如图所示。先来看一个简单的。

因为 `r1c9(3)` 和 `r2c8(3)` 同一个宫，所以不可能重复填；而 `r2c68(8)` 和 `r2c8(3)` 又必须不同假，所以构成强链；于是整个链就串起来了：

```
8r2c68=3r2c8-(3=8)r1c9
```

看起来还蛮简单的，是吧？

下面我们再来看一个。

<figure><img src="/files/GYHQ2HKQza4NW21eoAug" alt="" width="375"><figcaption><p>唯一矩形 + ALS-XZ，另一个例子</p></figcaption></figure>

如图所示。我们把双值格进行推广，使用一个实际的待定数组结构，搭配唯一矩形。

## 唯一矩形 + 毛刺数组 <a href="#unique-rectangle-burred-subset" id="unique-rectangle-burred-subset"></a>

<figure><img src="/files/I210H8OwEmVOa9bSFhoO" alt="" width="375"><figcaption><p>唯一矩形 + 毛刺数组</p></figcaption></figure>

如图所示。这次我们反着来。我们先假设 `r7c2 = 4` 看看会如何。

如果 `r7c2` 填 4，则 `r789c1` 只剩下 7、8、9 三种数字，于是形成显性三数组，然后 `r8c2 <> 7`。得到这一点我相信你肯定就能看明白了：因为 `r8c2` 只能填 4 或 5，而假设的 `r7c2` 填的又是 4，所以搭配右边 `r78c6(45)` 就会构成关于 4 和 5 的唯一矩形的矛盾。

这个用法类似于强制链证明矛盾的效果，不过这个例子似乎没那个必要以强制链形式呈现，毕竟就一个分支。我们把 `r789c1(4789)` 称为**毛刺数组**（Burred Subset），这是一种特殊用法。

我们再来看一个例子。

<figure><img src="/files/sasnCsdLvRMSd5qjuY1d" alt="" width="375"><figcaption><p>唯一矩形 + 毛刺数组，另一个例子</p></figcaption></figure>

如图所示。这个例子就自己推理了，它甚至比刚才那个例子还简单一些。

## 基于可规避矩形的一些构造 <a href="#avoidable-rectangle-pattern-based-construction" id="avoidable-rectangle-pattern-based-construction"></a>

前面我们看到了唯一矩形的构造形式，因为可规避矩形和唯一矩形类似，所以我们这里也顺带看一下可规避矩形的一些构造模式，就不单独列举页面了。

<figure><img src="/files/OokFY1M0SJArfRQ61bWN" alt="" width="375"><figcaption><p>可规避矩形 + ALS-XZ</p></figcaption></figure>

如图所示。这是一个可规避矩形搭配 ALS-XZ 的用法，不过这个题的待定数组是一个双值格 `r5c8`。

<figure><img src="/files/BkUjvPSAntabSyM8oY2r" alt="" width="375"><figcaption><p>可规避矩形 + ALS-XZ，另一个例子</p></figcaption></figure>

这也是可规避矩形搭配 ALS-XZ 的例子，不过这次又稍微不一样，多了一个单元格是已经填了数字的状态。

<figure><img src="/files/LGSkBWIz6zoqWdAqdalw" alt="" width="375"><figcaption><p>可规避矩形 + 宫排除</p></figcaption></figure>

如图所示。这是一个可规避矩形，但是要想删除 `r8c8(9)` 需要一点小技巧。

这次我们也利用一下毛刺数组那个例子里的强制链的思维方式。假设 `r8c8 = 9`，则 `b7` 填 9 的位置将只能放在 `r9c1` 上。

因为四个单元格均填上了 4 和 9，而都是自己填的数，所以仍然可以形成矛盾。所以，初始假设的 `r8c8(9)` 就是错误的，故结论就是 `r8c8 <> 9`。

好了，至此我们就把基础的构造模式介绍完了。下一节我们继续来看唯一矩形的一些更加离谱的构造模式。


# 代入唯一矩形

Unique Rectangle + n

在上一节的内容里，我们简要地提到了利用强制链的类似思维去证明某个数矛盾，进而删除原本假设填数的逻辑。实际上这样的唯一矩形用法非常繁多，所以本文将衔接这个内容单独讲解一下唯一矩形的这种用法。

## 什么是代入唯一矩形？ <a href="#what-is-a-unique-rectangle-plus-n" id="what-is-a-unique-rectangle-plus-n"></a>

我们先来看一个例子。

<figure><img src="/files/DLiLR59QcRHGrPHEc0Qo" alt="" width="375"><figcaption><p>唯一矩形 + 2B/1SL</p></figcaption></figure>

如图所示。我们尝试假设 `r1c9 = 7`，因为右下角 `r3c9` 是双值格，而 `r3c5` 也是双值格，于是 `r3c9` 和 `r3c5` 会分别填上 4 和 7。接着，因为 `c5` 存在关于 4 的共轭对，所以 4 必须填入一个；刚才我们得到 `r3c5 = 7` 了，所以只好让 `r1c5 = 4`。

但是，这么填入了之后会发现，四个单元格只填了 4 和 7，于是构成了唯一矩形的矛盾形态。所以，最初的假设 `r1c9 = 7` 是不合理的。所以这个题的结论就是 `r1c9 <> 7`。

我们把这种需要先假设后按结构绕一圈填数最终得到矛盾的唯一矩形类型统称为**代入唯一矩形**（Unique Rectangle + $$n$$，简称 UR + $$n$$）。显然，统称意味着这个结构的不简单。下面我们带着大家看看这种唯一矩形都有哪些情况。

> 顺带一提。这种唯一矩形的英文名和全双值格致死解法的一个类型的名称类似，也用的是“+ $$n$$”来表示，但是在唯一矩形里，$$n$$ 更多指代的是单元格的数量，即唯一矩形四个单元格里有多少个单元格除了含有除了唯一矩形的数字以外的别的数字。比如这个例子里，`r1c59` 都含有非 4 和 7 的数字，所以这个结构称为“唯一矩形 + 2”，英文名则为 Unique Rectangle +  2。至于图片下方给的名称，这个分类我们将放在本文的末尾，因为分类实在过于复杂，所以这里我单说也说不清楚。
>
> 另外，很显然，代入唯一矩形的初始状态就必须是 + 2 的形态，因为 + 1 对应的只有一种类型，即唯一矩形的类型 1（标准类型）；而那个类型又不需要这么看。

## 唯一矩形 + 2 <a href="#unique-rectangle-plus-2" id="unique-rectangle-plus-2"></a>

<figure><img src="/files/pquIJYUE6aIyGVhSVMp2" alt="" width="375"><figcaption><p>UR + 2B/1SL，另外一个例子</p></figcaption></figure>

如图所示。这个例子和刚才完全一样，就不解释了。

<figure><img src="/files/7tqlul1wy641g0QROw9n" alt="" width="375"><figcaption><p>UR + 2D/1SL</p></figcaption></figure>

如图所示。这个例子和刚才的稍微有点不一样，但是万变不离其宗。假设方式也差不多。

假设 `r9c2 = 9`，则右侧的单元格 `r9c4 = 3`，上方的单元格 `r7c2 = 9`，因为他们都是双值格。

然后，因为 `r7` 上有关于 9 的共轭对，所以 `r7c2 = 3` 了，只好让此时 `r7c4 = 9` 了。但是这么填完四个单元格后会发现，里面只填了数字 3 和 9，于是四个单元格就矛盾了。

这次也是唯一矩形 + 2，只是双值格的位置从同一侧变为了对角线两个单元格上，别的完全没怎么变，假设还是那种假设。

## 唯一矩形 + 3 <a href="#unique-rectangle-plus-3" id="unique-rectangle-plus-3"></a>

只有两个单元格包含额外数字的情况就全部说完了（本来也就这两种）。下面我们来看一下有 3 个单元格带有非唯一矩形使用的数字的情况。

<figure><img src="/files/x9gzskC6uOSakIxRtt5p" alt="" width="375"><figcaption><p>UR + 3N/2SL</p></figcaption></figure>

如图所示。这次我们要用两组共轭对。

假设 `r1c2 = 3`，则由于 `r3` 存在关于 3 的共轭对，而 `r3c2` 是双值格的关系，此时可以直接得到 `r3c2 = 5` 和 `r3c4 = 3` 的结论。

刚好，`c4` 有 5 的共轭对，思路直接串起来，我们又可以得到 `r1c4 = 5` 的结论。于是，四个单元格就只有 3 和 5 了，于是四个单元格构成了矛盾。

所以，`r1c2 <> 3` 是这个题的结论。

<figure><img src="/files/pGeLkf0OIXAM3mCQyasi" alt="" width="375"><figcaption><p>UR + 3U/2SL</p></figcaption></figure>

如图所示。假设 `r8c7 = 3`，则因为 5 的共轭对可得 `r7c7 = 5`。而与此同时，因为 `r8c7 = 3`，左侧有个双值格也可以得到 `r7c3 = 5` 的结论。不过，此时由于 `c3` 有 3 的共轭对，所以 `r7c3 = 3` 又可以得到。此时形成了矛盾。

<figure><img src="/files/kLjOe8OlrCbtgt5D0puS" alt="" width="375"><figcaption><p>UR + 3X/2SL</p></figcaption></figure>

如图所示。这次可以连删两个数字，不过因为删数逻辑是对称的，所以说一个就行。

假设 `r5c7 = 5`，则因为 `c7` 的共轭对可得 `r6c7 = 7`；与此同时，`r5c4 = 7`。然后因为 `r6` 又有共轭对，直接串联起来，可以得到 `r6c4 = 5` 的结论，此时形成矛盾。

<figure><img src="/files/lB99ZtrKuuz7eLiblIzB" alt="" width="375"><figcaption><p>UR + 3E/2SL</p></figcaption></figure>

如图所示。如果 `r1c8 = 9` 的话，则由于 `r1` 的共轭对的关系，`r1c3 = 1`。然后，因为下方的双值格的原因，`r3c3 = 9`。然后，又是 1 的共轭对，可以得到 `r3c8 = 1`，于是形成矛盾。

## 唯一矩形 + 4 <a href="#unique-rectangle-plus-4" id="unique-rectangle-plus-4"></a>

下面来看一个坑爹一点的，四个格子全都含有额外的数字。

<figure><img src="/files/iutCn2x7tvkdvGNQVCNi" alt="" width="375"><figcaption><p>UR + 4C/3SL</p></figcaption></figure>

如图所示。假设 `r2c5 = 7` 的话，则可以得到 `r2c4 = 8` 和 `r9c5 = 8` 的结论，因为这个单元格派生出了两个共轭对。

接着，因为 `r9` 包含 7 的共轭对，于是又可以得到 `r9c4 = 7`，于是形成矛盾。

## 唯一矩形 + 3 + 数组 <a href="#unique-rectangle-plus-3-plus-subset" id="unique-rectangle-plus-3-plus-subset"></a>

前面的例子我们都可以理解为纯正的若干共轭对的类型，他们非常像是之前早在唯一矩形里介绍过的类型 4、6 和隐性唯一矩形，只是把他结构推广了一下之后用了代入的视角。

不过，有没有想过，要想得出矛盾，那么共轭对和单元格的数量就一定有一个“减 1”的关系：要想矛盾，那么 $$n$$ 个共轭对可适用于 $$n + 1$$ 个包含其他非唯一矩形使用数字的单元格。比如刚才的 UR + 4 需要依赖 3 个共轭对；UR + 3 需要依赖于 2 个共轭对，之类的。

那么，如果无法找到适合数量的共轭对，比如 UR + 4 但只有 1、2 个共轭对的话，怎么办呢？我们也有办法。下面我们来看一下 UR + 3、UR + 4 里带有数组的情况。

<figure><img src="/files/2SrNi4tjHSmO6SNYG8SZ" alt="" width="375"><figcaption><p>UR + 3x/1SL</p></figcaption></figure>

如图所示。如果 `r1c9 = 4` 的话，显然因为 `r1` 的共轭对可以得到 `r1c8 = 8`，以及 `r9c9` 双值格导致的 `r9c9 = 8`。不过这样之后好像我们就无法继续了，因为共轭对数量不够，所以我们无法得到 `r9c8 = 4` 引起的矛盾。

不过，双值格 `r2c8` 帮了我们忙。因为 `r29c8` 只有 4、7、8，而 `r1c8 = 8`（此时），所以 `r29c8` 此时相当于是没有 8 的状态的，也就是只有 4 和 7。但是，别忘了 `r2c8` 同时还和 `r1c9` 同一个宫。这两个单元格一个 4 一个 8 就会使得 `r2c8` 只能填 7。那么，`r9c8` 也不能填 7 了，所以 `r9c8 = 4`，然后就矛盾了。

<figure><img src="/files/TMXZh58yqsnFeFn7uOsR" alt="" width="375"><figcaption><p>UR + 3X/1SL</p></figcaption></figure>

如图所示。这次我们将单元格推广一下，推广到两个格子。如果 `r6c8 = 9`，则同宫的 `r45c7` 只剩下 4 和 5，于是形成数组，于是 `r7c7` 就不能填 4 和 5 了，于是 `r7c7` 此时只剩下 8 和 9。配合上右边 `r7c8` 只剩下的候选数 8 和 9，搭配刚才初始假设的 `r6c8(9)` 以及共轭对造成的 `r6c7(8)`，四个单元格就构成了矛盾。

## 唯一矩形 + 4 + 数组 <a href="#unique-rectangle-plus-4-plus-subset" id="unique-rectangle-plus-4-plus-subset"></a>

<figure><img src="/files/q6zr6AYCmP9DsWjHyXq4" alt="" width="375"><figcaption><p>UR + 4x/1SL</p></figcaption></figure>

如图所示。这次我们推广到四个单元格均包含额外的数字。假设 `r1c4 = 3`，则共轭对可以引起 `r6c4 = 2` 的结论。不过接下来就推不动了。

我们来看共轭对的两头。一头填的 3，另一头填的 2。填 3 的这头和 `r2c5` 同在一个宫里，而填 2 的这一头和 `r5c5` 在一个宫里，最终会造成这两个单元格一个剩下 6 和 9，一个只剩下 9，于是形成显性数对。当然，你也可以使得填 2 这一头利用 `b5` 的过程，删掉此时 `r56c5` 里的候选数 2。这样结合起来，显然我们可以得到显性三数组。总之，`r1c5` 是不能填 3、6、9 的，故它只能填 2。

然后呢？然后结合 `r1c4` 和 `r12c5` 同宫的缘故，`r2c5` 不能填 3。由于 `c5` 里，2 和 3 必须填写在图中所给定的四个格子里，而且其中 `r1c5` 被其占位的原因，3 此时只能被迫落在 `r6c5` 之中，致使结构出现 2 和 3 的矛盾情况。

<figure><img src="/files/LiWKXeHB9DrxOyJccguR" alt="" width="375"><figcaption><p>UR + 4X/1SL</p></figcaption></figure>

如图所示。如果 `r8c5 = 2` 的话，则因为共轭对的关系，`r5c5 = 6` 可以得到。

接着我们来看 `r79c6`。这两个单元格因为都和 `r8c5` 同在一个宫，所以显然他们都不能填 2，于是结合 `r5c5 = 6` 的结论，我们可以快速得到 `r579c6` 构成关于 1、2、7 的显性三数组。这一形成不要紧，随着 `r8c5` 填 2 的思路下去，此时 `c6` 只能把 2 填在 `r5c6` 之中；然后呢？然后 6 就没位置放了，只能放 `r8c6` 里，然后就矛盾了。

<figure><img src="/files/2orDnqilaOwGxX3GBGiL" alt="" width="375"><figcaption><p>UR + 4x/2SL</p></figcaption></figure>

如图所示。这次我们稍微再多用一个共轭对，减轻一些压力。

假设 `r7c4 = 7`，则我们可以得到 `r1c4` 和 `r7c6` 同时填 4 的结论。因为此时 `r4c6` 是双值格，所以只剩下蓝色数字 9，因此 `r4c6 = 9`。而刚才我们知道，`r1c4 = 4`，所以 `r1c6` 既不能填 4 也不能填 9，只好填 7。于是，四个单元格只剩下 4 和 7 的填数，于是就形成了矛盾。

是不是比刚才那个简单一些？

<figure><img src="/files/HxODbbgjx3IsUDRgxmst" alt="" width="375"><figcaption><p>UR + 4X/2SL</p></figcaption></figure>

如图所示。如果 `r9c6 = 7` 的话，因为共轭对的关系，会引起 `r3c6` 和 `r9c5` 同时填 8。因为此时 `r8c5` 和 `r9c56` 两个已经填上数字的单元格同在一个宫里，所以此时 `r8c5` 只剩下 1 和 4。而 `r5c5` 又和 `r9c5`（填 8）同在一个列上，于是它又剩下 1，此时 `r58c5` 构成了关于 1 和 4 的显性数对，使得 `r3c5` 只能是 7 和 8，于是形成了只有 7 和 8 的矛盾。


# 代入唯一矩形的命名

Naming System of Unique Rectangle + n

好了。我想我已经充分说到了应该说的内容。下面我们来提一下它的命名。

> 命名规则算是比较麻烦的地方，因为我们这里并不是考试，所以不需要你记住它，我自己也记不住，但是可以用于拓展阅读。搞清楚怎么推理的就行。

## 标准命名规则 <a href="#standard-naming-rules" id="standard-naming-rules"></a>

它的完整命名是使用单元格数量和共轭对数量搭配的，即“唯一矩形 + <单元格数>/<共轭对数>SL”。其中 SL 是 Strong Link 的缩写，即强链。

然后，透过现象看本质。数一数结构有多少个单元格可以含有唯一矩形用不到的数字，比如说有一个唯一矩形用 2 和 5 形成矛盾，但是有其中三个单元格含有别的数字（不是 2 或 5 的数），那么我们就可以称为 UR + 3。不过这里要注意一点的是，这个含有非 2 和 5 的数字不一定需要满足。比如有个单元格它因为一些原因没有其他的数字，但它原本是可以有的（就算有也不影响推理），那么它也可以纳入这里的计算。

<figure><img src="/files/HxODbbgjx3IsUDRgxmst" alt="" width="375"><figcaption><p>UR + 4X/2SL</p></figcaption></figure>

就比如这个 UR + 4X/2SL 的例子里，因为我们知道推理过程之中，`r9c5` 唯一的作用是和 `r9c6` 搭配 8 的共轭对。这也就是说，`r9c5` 即使含有除了 7 和 8 以外的候选数，这个结构仍然是成立的——因为这些多出来的候选数并不会真正影响推理过程。所以，在这个例子里，我们需要数出来哪些单元格可以包含额外的、非唯一矩形使用的数字，也不影响推理。它有几个，那么这个结构就叫 UR + 多少。比如这个例子 `r9c5` 显然可以允许增加额外的数字，而 `r3c56` 和 `r9c6` 客观存在其他的数字，所以整个结构 4 个单元格全都允许有跟唯一矩形无关的数字出现，故这个结构分类为 UR + 4。

## 额外规则 <a href="#extra-rules" id="extra-rules"></a>

可以看到，在每一个例子的图片下方，我都写上了它的归类名称，其中名称的数字后面还跟了一个字母，有大写也有小写。这个规则会稍显复杂一些，所以就不用死记硬背了。这里列举一下他们。

* UR + 2
  * B：双值格位于同一侧；
  * D：双值格位于对角线上；
* UR + 3
  * 1 个共轭对
    * x：搭配的数组形成只需要依赖于共轭对的一头；
    * X：搭配的数组形成需要共轭对两头要同时作用；
  * 2 个共轭对
    * N：共轭对垂直，起始假设的单元格和双值格同侧，和两个共轭对汇集的单元格同侧（互相看得见）；
    * U：共轭对平行，起始假设的单元格和双值格同侧（互相看得见）；
    * X：共轭对垂直，起始假设的单元格和两个共轭对汇集的单元格处于对角线关系（看不见）；
    * E：共轭对平行，起始假设的单元格和双值格处于对角线关系（看不见）；
* UR + 4
  * 1、2 个共轭对
    * x：搭配的数组形成只需要依赖于共轭对的一头；
    * X：搭配的数组形成需要共轭对两头要同时作用；
  * 3 个共轭对
    * C：三个共轭对里其中数字相同的两个共轭对垂直；
    * X：三个共轭对里其中数字相同的两个共轭对平行。


# Wing 构造

Wing Construction

之前我们了解了唯一矩形这种结构技巧的构造逻辑，大概是将技巧进行结合的手段。下面我们来看结合链的构造逻辑。而链的构造相对困难一些，所以内容会比较多一些。我们先从简单的入手。

## XY-Wing 构造链 <a href="#xy-wing-constructed-chain" id="xy-wing-constructed-chain"></a>

在之前的内容里，我们知道，XY-Wing 和 XYZ-Wing 这两种 wing 类型的技巧是伪数组的一种特殊摆放形式；而伪数组又是待定数组的一种特殊形式；甚至 XY-Wing 还能是链的特殊形式，所以这两个技巧从技巧分类的角度来看，具有非常多样化的理解视角，这便是这两个技巧适合用于构造的本质原因。

我们先来看一个例子。

<figure><img src="/files/NXfR07lE3Dkaa0NlYRtw" alt="" width="375"><figcaption><p>一个再平常不过的 XY-Wing</p></figcaption></figure>

如图所示。这是一个再普通不过的 XY-Wing 技巧了。不过很遗憾的是，这个 XY-Wing 似乎并不存在删数。不过不要紧，我们来了解一下 XY-Wing 的推断，看看能否将 XY-Wing 的过程稍加延续一下。万一后续有结论呢？

XY-Wing 的推理方式是，从拐点 `r4c6` 开始分支讨论，并得到两个分支上的终点 `r4c2(5)` 和 `r6c4(5)` 里至少有一个 5 为真。

发现什么问题没有？这两个 5 至少有一个为真。换一句话说就是，这两个 5 不同假。不同假在链里是描述为强链关系的，所以，我们可以将其作为强链关系，仅连接这两个 5，于是我们就能找到这么一条利用这个特殊强链关系搭建起来的多宝鱼：

<figure><img src="/files/ZA0qaopzwECJsy9dHibo" alt="" width="375"><figcaption><p>利用特殊强链关系搭建的多宝鱼</p></figcaption></figure>

如图所示。我们可以看到，我们利用上 `c5` 的数字 5 的强链就可以得到这么一个多宝鱼技巧。表示如下：

```
5r4c2=5r6c4-5r5c5=5r9c5
```

这便得到了一条可以删数的链，链的长度也不长，但提供了一个良好的、找寻删数的视角。我们把这个链里使用 XY-Wing 的手段就称为**链构造**或**构造链**（Constructed Chain）。

## 构造的主次关系 <a href="#primary-and-secondary-relations-of-constructed-chain" id="primary-and-secondary-relations-of-constructed-chain"></a>

可以看出，构造的逻辑确实结合了两种技巧，但是技巧之间是分主次关系的。比如之前的唯一矩形构造，唯一矩形是导致删数的根本核心技巧，而它的推理过程之中会依赖其他的技巧（如待定数组等），所以我们将唯一矩形作为构造技巧的技巧名，称为唯一矩形的构造；而这里也是一样，这个技巧本质是一个链，只是链里用上了 XY-Wing 产生的特殊强链关系；正是因为链是这个技巧的主要推理过程，所以我们把这个称为链的构造而不是 XY-Wing 的构造。

这种用法往往都有合理的主次关系，但也存在一些特殊情况使得我们无法清晰辨认主次，不过目前我们还遇不到，所以我们先记住，**占主导地位（即核心推理）的技巧作为这个构造技巧的技巧名**即可。

## XYZ-Wing 构造链 <a href="#xyz-wing-constructed-chain" id="xyz-wing-constructed-chain"></a>

XY-Wing 的用法如果你觉得还不够高级，那么我们不妨来看看 XYZ-Wing 的构造链。

### XYZ-Wing 构造强链 <a href="#how-to-construct-strong-inference-in-an-xyz-wing" id="how-to-construct-strong-inference-in-an-xyz-wing"></a>

为了确保后续的内容能看明白，我们先来看一个标准的 XYZ-Wing。

<figure><img src="/files/yj6bZntvqUAk6uYAAw4r" alt="" width="375"><figcaption><p>一个标准的 XYZ-Wing</p></figcaption></figure>

如图所示。XYZ-Wing 技巧的本质用法和 XY-Wing 非常相似，只不过比 XY-Wing 又多了一个候选数。讨论的时候我们需要按拐点 `r5c5` 进行讨论，最终得到橘色的三处候选数 3 里至少有一个为真。

显然，这种表述方式下我们就可以很明显地知道，三个 3 之间是有强链关系的。比如这个题里，我们可以认为是 `3r5c2=3r45c5` 这个强链关系成立，也可以认为是 `3r4c5=3r5c25` 这个强链关系成立，即使看起来这个跨了宫的 `r5c25(3)` 这个节点好像不会发挥啥作用。但是，你就说它能不能构成强链关系就完事了。

因为强链关系本质是证明两个节点不同假，或者说证明同假时矛盾。对于这三个 3 而言，只要将节点分为两组，一组有一个 3，另一组有两个 3，然后讨论它们不同假就行。而对于链节点而言，`r45c5(3)` 这种区块节点，或者 `r5c25(3)` 这种同在一个行里的两个格子的节点，认定它同假就意味着里面没有任何一个位置可以填这个 3。显然，这个推理适用于上述提到的这两种特殊节点的情况，所以道理是合适的。

既然合适，那我们就可以将其派上用场。

### XYZ-Wing 构造链的例子 <a href="#example-of-xyz-wing-constructed-chain" id="example-of-xyz-wing-constructed-chain"></a>

<figure><img src="/files/XoW4JK7wG2QXi5ZwTdGt" alt="" width="375"><figcaption><p>XYZ-Wing 结构</p></figcaption></figure>

如图所示。这是一个 XYZ-Wing。不过很遗憾的是，这个 XYZ-Wing 似乎也没有删数，因为删的是三个 7 的交集，但交集 `r6c13` 都不是空格，也更不可能存在 7 的候选数作为删数。那么我们只能延伸推理。

<figure><img src="/files/e0fv285BMLfFTtZfi8BX" alt="" width="375"><figcaption><p>XYZ-Wing 构造链</p></figcaption></figure>

如图所示。利用 7 的强链，我们可以构造出这样的链：

```
7r6c46=7r4c46-7r4c2=7r6c26
```

非常神奇的例子。我们利用了 `7r4c2=7r6c26` 这样的强链关系就可以得到这么一个多宝鱼技巧，然后就有了删数。

不过要注意的是，这个例子里的链头是 `r6c46(7)`，而链尾是 `r6c26(7)`，它们恰好位于同一行，所以删数是这行的其余位置的 7。之前的链技巧里很少遇到有这种情况的例子，这里便是一个。

下面我们再来看一个例子。

### 利用斜边的特殊强链构造 <a href="#a-special-node-using-both-leaf-cells" id="a-special-node-using-both-leaf-cells"></a>

<figure><img src="/files/GDntWoHmHgxKOxqrsplT" alt="" width="375"><figcaption><p>斜边节点构造强链</p></figcaption></figure>

如图所示。这个初次看的时候肯定一头雾水。这个的写法如下：

```
7r5c2=7r5c7|r6c2-7r6c9=7r5c7
```

非常离奇，是不是。XYZ-Wing 构造的强链还能是斜边作为一个整体节点来用。我们来细说一下这个的推理。

先是 XYZ-Wing 构造这个强链可不可以用的问题。我们把三个 7 分为两组，形成两个节点，一个是 `r5c2(7)`，而另一个是 `{r5c7, r6c2}(7)`。而我们要证明的是这两个节点不同假。

其中 `r5c2(7)` 倒好说，但是后面这个斜着的两个位置表示的节点，它为假代表什么意思呢？先我们来定义一下这玩意儿啥时候应该为真。要让这个节点为真，我们只需要让它只要有其中一边为真即可。而所谓“至少有一边为真”，从数学的角度上来说就是 $$\ge 1$$ 个位置为真。那么为假自然就是它的相反情况，即 $$< 1$$ 个位置，即 $$=0$$ 个位置，也就是两处单元格均不能填 7 的意思了。所以，节点 `{r5c7, r6c2}(7)` 为假就是说这两个单元格都不填 7。而这符合我们这个链的推理过程，也没有不严谨的地方，所以可以这么用。

那么，这个强链合理之后，我们来看节点 `{r5c7, r6c2}(7)` 和 `r6c9(7)` 是否可以构成弱链关系。答案是肯定的，因为它们确实不能同真：当 `{r5c7, r6c2}(7)` 为真的时候，`r6c9(7)` 刚好在这两个位置的交集上，不论 `r5c7` 填 7 还是 `r6c2` 填 7，这个 `r6c9` 都是不能填 7 的。于是这个弱链关系也成立，于是搭配后面宫内的强链关系，这个链就构成了。删数自然就是头尾 `r5c27` 的交集了。这个例子也是同一行的头尾。

所以，我们可以从前面两个例子里知道，**XYZ-Wing 构造的强链用到的三个候选数，任意划分为两组都能形成强链关系**。

## W-Wing 构造链 <a href="#w-wing-constructed-chain" id="w-wing-constructed-chain"></a>

下面我们来看 W-Wing 的构造链。

<figure><img src="/files/5ThhSZV1RqDLquyTMvXK" alt="" width="375"><figcaption><p>W-Wing 结构</p></figcaption></figure>

如图所示。这是一个普通的 W-Wing 技巧，不过也没有删数。不过也没事，因为我们知道 W-Wing 的结论是 `r1c2(6)` 和 `r5c5(6)` 里至少有一处为真，所以，这也是一个强链关系。

我们搭建起强链关系后，连接其他的弱链和强链关系也可以用于一些链之中。比如我们可以这么连：

<figure><img src="/files/CXntUU1T2zkzfgMPUPTa" alt="" width="375"><figcaption><p>W-Wing 构造强链</p></figcaption></figure>

如图所示。可以看到，这仍然是一个多宝鱼，（怎么全部例子都是多宝鱼构造？！）删数是图中的 `r13c1(6)`。链写法如下：

```
6r1c2=6r5c5-6r7c5=6r7c1
```

好了，至此我们就把基础的三种 wing 技巧的构造方式介绍完了。虽然看起来内容不多，但更多的还是在做题上。所以希望各位下来多做题，练一下手。这些找起来都不困难。


# 毛刺和毛边

Kraken Logic

在学习了基础的构造后，我们来看看一个构造思想，这个构造思想基于早期的鱼鳍概念，不过会参杂链的内容。


# 毛刺的基本推理

Reasoning of Burr

## 毛刺的概念 <a href="#concept-of-burr" id="concept-of-burr"></a>

<figure><img src="/files/g7Jy18m3INWil8xwI3Yk" alt="" width="375"><figcaption><p>毛刺数组</p></figcaption></figure>

如图所示。假设我们忽略 `r3c9(7)` 这个候选数，当它不存在的话，那么 `r3c789` 三个单元格将只有 2、5、6 三种候选数，构成显性三数组（严格来说是死锁三数组），于是，`b3` 和 `r3` 上其余位置的 2、5、6 均可删除，就像是图上这样的删数。

但是很明显我们不能这么做，因为 `r3c9(7)` 的客观存在导致我们无法将删数当成真的结果。这可怎么办呢？没事，我们就按鱼鳍的类似逻辑去思考这个数。

倘若它不存在（为假），则有数组删数；但如果它为真的话，那么我们不妨就用一下强制链的思维去看别的地方有没有结论。

<figure><img src="/files/lFjIjL1deHm78XtV2YdE" alt="" width="375"><figcaption><p>毛刺 XY-Wing</p></figcaption></figure>

然后，就真的被我们逮着了：如果 `r3c9(7)` 为真，则 `r6c9(7)` 为假，于是对于 `r34c8` 和 `r6c9` 三个单元格而言，XY-Wing 结构就成立了，删数是 `r23c9(6)`。

那么，结合两个配图我们可以看到，数组成立时候的删数和 XY-Wing 成立时候的删数均包含 `r2c9(6)`，因此，这个题的结论就是 `r2c9 <> 6` 了。

可以从这个例子里看到，我们稍微借助了一下鱼鳍的概念，将 `r3c9(7)` 这个候选数视为鱼鳍分情况讨论了一下，然后发现两种情况均可删除同样的位置，于是删数便成立。我们把这种鱼鳍的类似用法，放在强制链里推导的思维称为**毛刺**（Kraken Burr、Burr 或 Kraken Fin）。

## 以毛刺冠名的技巧不区分主次关系 <a href="#there-is-no-primary-and-secondary-relation-on-naming-of-kraken-patterns" id="there-is-no-primary-and-secondary-relation-on-naming-of-kraken-patterns"></a>

对于这个用法而言，`r3c9(7)` 是作为数组的毛刺存在。不过我们也可以把这个链倒过来看：从 XY-Wing 出发，发现 `r6c9(7)` 是结构的毛刺。它为真的时候会引发 `r3c9(7)` 为假，于是数组成立。从这个视角里可以看出，毛刺的使用是不怎么区分先后关系的，它更像是链里正反都可以推理的效果，所以毛刺结构具体跟什么技巧所绑定命名，其实都可以。比如这个题你叫它毛刺数组是可以的；你叫它毛刺 XY-Wing 也是可以的。

不知道你还记不记得，早在链里我们就用过了毛刺的说法——毛刺数组链。在那个时候，它因为刚好是数组里多了那么一坨的东西，本身因为不影响链的直推逻辑，所以毛刺在那个时候还只是一个名称而已；对于现在，毛刺可能就不那么直观了，它不一定能作为一个单独的链在使用，它必须讨论真假性进行删数的寻找。

## 多个毛刺 <a href="#multiple-burrs" id="multiple-burrs"></a>

我们再来看一个例子。

<figure><img src="/files/G4jWXacKBpn1GMsd8oq1" alt="" width="375"><figcaption><p>毛刺拓展矩形</p></figcaption></figure>

如图所示，这是一个毛刺拓展矩形，有三个毛刺：`r23c1(9)` 和 `r3c4(9)`。我们直接讨论他们的真假性。如果三个毛刺全为假，则会有图上的这样的画法。链表示如下：

```
4r3c6=(4-1)r23c4=1r3c8-(1=9)r3c9
```

这里用到了一个区块弱链关系 `(4-1)r23c4`，原因是同真之后，数字 2 无法成功填入 `b2` 导致矛盾。所以这是一个很正常的不连续环，记住这是当毛刺为假时构成的不连续环。

那么，三个毛刺如果至少有一个为真呢？我们也有链可以用，不过我们稍微需要把毛刺拆一下，分个组。很显然 `r3c4(9)` 和删数 `r3c6(9)` 同在一个宫里，所以它为真的情况可以直接视为鱼鳍直接删数，就不用参与链的讨论；当然，`r3c1(9)` 因为和删数同行，所以也可以不考虑。但是，左边的 `r2c1(9)` 就不行了，这个确实跟删数没有直接关系。

那么我们不妨就这么分组。如果 `r3c14(9)` 这两个毛刺为假，而 `r2c1(9)` 为真时，我们有这个强制链：

<figure><img src="/files/NMdhlIZxTFnEE2VwvdIc" alt="" width="375"><figcaption><p>毛刺 r2c1(9) 为真的讨论</p></figcaption></figure>

如图所示。我们有这么一个强制链。假设 `r2c1(9)` 为真时，可以得到 `r46c1(9)` 为假的逻辑。所以这两个单元格会构成关于 4 和 5 的显性数对。为了确保 `r46c16(45)` 不会出现唯一矩形的矛盾，由于 `r46c6(5)` 是共轭对，所以必须让 `r3c6(4)` 此时为真，以规避数字 4 也为共轭对直接出现矛盾。所以可以得到 `r3c6(4)` 为真的结果。

也就是说，如果 `r2c1(9)` 毛刺为真，我们可以得到 `r3c6(4)` 为真的结论，这恰好也可以删除 `r3c6(9)`。

然后就还剩下一种情况了，即 `r3c14(9)` 这两个毛刺至少有一个为真。这两个的话，因为刚好和 `r3c6(9)` 删数同在一个行里，所以它俩但凡有一个为真都可以直接删。

所以，我们经过三轮的讨论，最终可以得到 `r3c6 <> 9` 的结论。


# 毛刺的使用

Usages of Burr

前一节里我们知道了毛刺的基础概念，和它需要派生出强制链分支的做法的本质原因。下面我们来看一些例子。

## 例子 1：双毛刺 W-Wing <a href="#example-1" id="example-1"></a>

<figure><img src="/files/silSF9ANOftY53rf3EeA" alt=""><figcaption><p>两个毛刺 W-Wing</p></figcaption></figure>

如图所示。这个题上来就给了我们一个下马威。

先注意 `r7c78(7)` 两个候选数。如果这两个候选数为假，则此时图中的两个 W-Wing 就是成立的，并可以得到删数 `r9c1 <> 7` 和 `r8c3 <> 7`。为什么？因为 `b9` 的数字 7 和 8 的位置很特殊。候选数 8 只能填在 `r9c7` 和 `r8c8` 里，而其中有一个单元格必须是 7（因为我们假设了前面 `r7c78(7)` 同假），所以相当于是隐性数对。

记住隐性数对这个说法。因为是隐性数对，所以这两个单元格 `r8c8` 和 `r9c7` 此时就好比是只有 7 和 8，毕竟 7 和 8 只能填到这两个单元格了，所以其他的数均可在这个情况下当他们不存在。所以，结合图中边上标记的这些候选数，和 `b6` 的数字 8 的共轭对，我们就有两个走向不同的 W-Wing，分别利用 `r8c8` 和 `r9c7` 形成删数。

因为这两个 W-Wing 均为同样的毛刺 `r7c78(7)` 为假得到，所以他们的关系应该是同时满足的。换言之，删数 `r9c1(7)` 和 `r8c3(7)` 此时是可以同时得到的，也可以一起作用，并非是按分支的方式讨论。

<figure><img src="/files/Qp3ggR98LUNxf3fSaeV3" alt="" width="375"><figcaption><p>然后……就有这么个删数逻辑</p></figcaption></figure>

如图所示。因为 W-Wing 的关系，于是我们可以得到，`b7` 里此时可以填 7 的位置只能是 `r7c13`。所以有这么个强链关系，于是 `r7c13(7)` 为真，故 `r7c46 <> 7`。

别忘了毛刺。这是毛刺 `r7c78(7)` 为假删数。那么毛刺为真呢？非常好，毛刺刚好和此时 `r7c46(7)` 同在一行上，因此也可以删掉这俩。所以不论毛刺的真假，`r7c46(7)` 都是可以删除的，所以这个题的结论就是 `r7c46 <> 7` 了。

## 例子 2：毛刺唯一矩形类型 3 <a href="#example-2" id="example-2"></a>

<figure><img src="/files/LwZB7FTRnPluvMsLYuLK" alt="" width="375"><figcaption><p>毛刺 r2c7(9) 为假</p></figcaption></figure>

如图所示。如果 `r2c7(9)` 为假的话，右边 `r13c7(89)` 就会构成隐性数对，配合左边 `r13c1(89)` 会构成唯一矩形类型 3，于是会有删数 `r4c1 <> 3` 和 `r8c1 <> 2` 的结论。

但是很明显毛刺是客观存在的。所以我们要讨论它为真的情况。不过很容易我们就会发现有一个强制链的走向可以引导我们删除这两个数：

<figure><img src="/files/khjrFPdLMQxBbu0RXlRi" alt="" width="375"><figcaption><p>毛刺 r2c7(9) 为真</p></figcaption></figure>

如图所示。当毛刺 `r2c7(9)` 为真时，我们可以立马得到 `r2c26(9)` 为假的结论，于是借用待定数组可得 `r2c9(6)` 为真，于是 `r9c9(6)` 为假，`r8c8(6)` 为真。

到这里我们线路就可以同时走两个不同的分支了。其中一个分支是当 `r8c8(6)` 为真时，`r8c3(2)` 为真这个分支，这个分支可以删除 `r8c1(2)`；另外一个分支是当 `r8c8(6)` 为真时，`r8c1(6)` 为假，于是因为 `c1` 数字 6 是共轭对的关系，又可以得到 `r4c1(6)` 为真的结果。

于是，我们构建出两个不同的走向，导向两个不同的删数。因为他们俩此时是并排的关系，所以删数是可以同时成立的。大不了理解不能的话，就挨个分开删，对吧？

## 例子 3：毛刺 XYZ 半环 <a href="#example-3" id="example-3"></a>

<figure><img src="/files/25XklAiSOvTiwQgZi5Hs" alt="" width="375"><figcaption><p>毛刺 r6c9(6) 为假</p></figcaption></figure>

如图所示。当 `r6c9(6)` 为假的时候，注意到 `r6c69` 和 `r9c6` 三个单元格是一个 XYZ-Wing，然后搭配 `b9` 的共轭对，于是一个 XYZ 半环就构成了。删数此时包含 `r6c1(4)`。

> 我知道 XYZ 环作为动态环的删数非常难以理解。这里你要是看过之前对于动态半环的介绍，以及 XYZ 环的删数逻辑仍然还是记不住怎么删数的话，那么这里你还可以尝试去讨论一下 `b9` 两头 5 的填数为真所影响的情况。如果 `r8c9 = 5` 的话，`r6c9(4)` 为真；如果 `r9c7 = 5` 的话，则由于 `r9c6(1)` 此时为真，所以 `r6c69` 会构成关于 4 和 5 的显性数对（因为此时有 `r6c6(1)` 为假）。所以删数是包含 `r6c1(4)` 的。

那如果毛刺为真呢？

<figure><img src="/files/dn1v6FgjeusqN3l18QXB" alt="" width="375"><figcaption><p>毛刺 r6c9(6) 为真</p></figcaption></figure>

如图所示。当 `r6c9(6)` 为真的时候，我们引出强制链分支，可以导向 `r6c7(4)` 为真的结果，于是，`r6c1(4)` 仍然可以删除。

因此，这两种情况都可以删除 `r6c1(4)`。故本题的结论就是 `r6c1 <> 4` 了。

## 例子 4：毛刺融合待定数组 <a href="#example-4" id="example-4"></a>

<figure><img src="/files/SAYBmY3oJLxGIoXKgfRC" alt="" width="375"><figcaption><p>毛刺 r5c8(2) 为假</p></figcaption></figure>

如图所示。如果 `r5c8(2)` 为假的话，则 `r4c3` 和 `r5c128` 四个单元格里的数字只有 2、3、4、5，而且每一个数字都最多只能出现一次，所以融合待定数组就会形成，此时 `r5c4 <> 45, r5c6 <> 4, r5c9 <> 5` 都属于是这个结构的删数。

不过因为 `r5c8(2)` 客观成立，所以我们不得不需要讨论它为真的情况。

<figure><img src="/files/iGk5nlxT3v8vuZ3Z04fs" alt=""><figcaption><p>毛刺 r5c8(2) 为真</p></figcaption></figure>

如图所示。当毛刺 `r5c8(2)` 为真的时候，我们会有两个不同的分支导向，分别能得到 `r5c1(2)` 为真（左图）和 `r4c456(4)` 为真（右图）。

显然，两个分支均可因为 `r5c8(2)` 为真时得到，所以他们的删数是可以同时成立的，因此两次得到的不同删数叠加起来和毛刺为假时融合待定数组可以删的那四个数也都一样，所以这四个数是可以删除的正确结论。


# 毛边的基本推理

Reasoning of Kraken Link

前面我们学完了毛刺的用法，毛刺就是在结构上多出一个或多个候选数，需要我们讨论它的真假性（使用鱼鳍的类似逻辑），当为假的时候结构成立，当为真时引出强制链的方式找出公共的删数。

那么，有没有想过，如果这样的候选数无法使用真假引出删数（比如有两个毛刺，而且位置似乎看起来不相关），那么我们应该怎么去思考呢？

## 毛边的概念 <a href="#concept-of-kraken-link" id="concept-of-kraken-link"></a>

<figure><img src="/files/cWgKObya5cyHzFRD9MA6" alt="" width="375"><figcaption><p>毛边数组</p></figcaption></figure>

如图所示。如果我们图中 `r6c3` 不含有候选数 3 和 9 的话，那么显然它就是一个标准的显性数对，所以删数自然是可以成立的。但是很遗憾的是，由于这 3 和 9 是客观存在的，所以我们不能用于删数。

而这个比较遗憾的是，之前的毛刺可以用找强制链去取交集，但这个例子有两个毛刺，如果挨个去找强制链，就至少需要两条强制链，这肯定划不来。那么我们换一个思路。

显然图中两个候选数 `r6c3(39)` 组合起来一共只有四种填法：

* `r6c3(3)` 为假、`r6c3(9)` 为假；
* `r6c3(3)` 为假、`r6c3(9)` 为真；
* `r6c3(3)` 为真、`r6c3(9)` 为假；
* `r6c3(3)` 为真、`r6c3(9)` 为真。

这四种填法里，肯定在答案里仅对应一种正确的情况。虽然我们不知道，但是我们可以强行进行归类。如果 `r6c3(39)` 同为假的话，这很明显数组就可以使用，所以它单独成为一个情况；而其他三种呢？其他三种从解的角度来看，客观是不同为假的（这不废话吗）。

但是！不同假意味着强链关系。也就是说，对于其他三种情况而言，我们不必再细分下去三种子情况挨个讨论，而是合理地将他俩不同假的状态视为强链关系即可。

既然如此，我们可以利用这个强链关系构造出这么一个异数链：

<figure><img src="/files/s9mW5JJvtSk2ZkW5eoUY" alt="" width="375"><figcaption><p>强链毛边构造异数链</p></figcaption></figure>

如图所示。链的写法如下：

```
(4=3)r7c5-(3=9)r7c3-(9=3)r6c3-(3=4)r6c4
```

是的，很普通的双值格链。请注意 `(9=3)r6c3` 这个强链关系。它显然并非客观成立，而是刚才我们在假设这两个候选数不同假时才会形成的情况。这一点很重要。

因为这个双值格链是正确的，所以删数 `r8c4 <> 4` 此时也是正确的，只不过只是在这条强链成立状态下才有的删数。不过不急，因为这个删数不足以让我们得到整个题的结论，所以我们还需要继续推理。

紧接着，我们有这个删数后，我们可以引出一条以假起头的强制链：

<figure><img src="/files/PtwYGXOCvTUqRXPayInT" alt="" width="375"><figcaption><p>由 r8c4(4) 引出的强制链</p></figcaption></figure>

如图所示。因为此时 `r8c4 <> 4`，所以我们可以引出这一条强制链，得到 `r4c9(4)` 此时为真的结果。

梳理一下，我们刚才是假设两个毛刺 `r6c3(39)` 至少有一个为真后，可引发一个双值格链得到 `r8c4(4)` 为假，于是强制链得到 `r4c9(4)` 为真，最终引出和数组相同删数的结论 `r4c3 <> 4`。

整合一下的话，因为两种情况（而对于 `r6c3(39)` 而言是四种排列情况）下均有 `r4c3(4)` 为假的结果，因此这个题的结论就是 `r4c3 <> 4` 了。

像是图中两个毛刺 `r6c3(39)` 无法直接引出强制链进行删数推理，而需要借助他们组合在一起的强链关系（也可以是弱链关系，后面会提到）来进行删数情况讨论的思路，我们把他称为**毛边**（Kraken Link）。

可以从例子里看到，毛边必须至少有两个毛刺参与才能进行使用，否则无法构造出这样的强链或弱链关系。

## 毛边强制链整合成普通链 <a href="#integration-of-forcing-chain-using-kraken-link" id="integration-of-forcing-chain-using-kraken-link"></a>

### 整合后的奇怪现象 <a href="#strange-behavior-of-chain-integrated" id="strange-behavior-of-chain-integrated"></a>

在前面的例子里，我们拥有了强链毛边关系后，引发了一个普通的链，得到了一个删数后又利用此删数接续。这个行为更方便我们对技巧的推理次序进行拆解，所以我们也希望将其拆成这样便于理解他们。但是，实际上我们想按照普通链删数的思路去做这个事情，实际上也是可以的，那么我们就需要将这种多步推理得到结论的过程整合起来成为一条普通链。

但是，总有一些例子整合成普通链就会出点令人费解的问题，下面我们就针对前面这个例子说一下有多么令人费解。

<figure><img src="/files/UoILzX6JT46J2LHZa7bc" alt="" width="375"><figcaption><p>将双值格链和强制链整合起来</p></figcaption></figure>

如图所示。我知道你肯定看得一头雾水，所以我打算给各位描述一下它的文本写法：

```
4r4c9=4r456c8-4r8c8=4r8c4-(4=3)r7c5-(3=9)r7c3-(9=3)r6c3-(3=4)r6c4-4r8c4=4r8c8-4r456c8=4r4c9
```

是的，非常奇怪。要想仍然删除 `r4c3(4)`，那么我们需要构造一条普通链删它的同时利用好强链毛边关系。可这次我们假设的是从 `r4c9(4)` 为假起头。它起头我们就必然依赖强弱链关系一直到 `r8c4(4)` 为真（`r4c9(4)` 假，`r456c8(4)` 真，`r8c8(4)` 假，`r8c4(4)` 真）。

接着，我们继续，将 `r8c4(4)` 为真接入双值格链的部分，比如这里接入到 `r7c5(4)` 得到其为假，然后双值格链这一部分的强弱链关系和之前完全一样，所以连假设的真假性也一样，中间就不重复了。

然后，我们可以到达 `r6c4(4)` 这里并得到它为真，然后就有 `r8c4(4)` 为假。是的，我们又一次回到了 `r8c4(4)` 这个位置上。但这里情况就有点不对了——刚才我们从 `r4c9(4)` 到这里明明还为真的，怎么绕一圈回来它就为假了？这实际上是双值格链在“发力”，因为在这个情况下，双值格链是客观成立的，所以自然可以知道 `r8c4(4)` 是不可能为真的。而最开始还没进入 `r7c5(4)` 之前，`r8c8(4)` 是为真的，这仅仅是因为它此时还并未和双值格链产生“羁绊”，它是从 `r4c9(4)` 出发得到的为真。

如果我们强行继续推理的话，我们将顺着 `r8c4(4)` 为假，然后利用好强弱链关系可以逆向推理的特性，又一次回到 `r4c9(4)` 上去。不过这次，因为 `r8c4(4)` 是为假的，所以顺着下去依次是 `r8c8(4)` 真、`r456c8(4)` 假，以及 `r4c9(4)` 为真。

看到了吗？整个一条链就构造完成了，我们强行将双值格链引发的删数纳入普通链的整合逻辑里去，这样我们可以得到这条特殊的普通链，普通链的其中一部分节点因为强行利用强链毛边关系，所以不得不让普通链走一组已经走过的节点。

这种走过的节点在普通链里我们并未这么用过，那么如果我们真要这么看的话，它是否是严谨和合理的走法呢？实际是合法的，因为它没有破坏我们整个链路里的所有强弱链关系，用还是用上了，而且也没有破坏它（比如强链用成弱链，弱链用成强链之类的错误或不正常的用法）。

所以，对于这种合法但是有病的操作，最好还是少用。这里提供给你，只是让你知道它是可以的视角，在有些时候我们可以借用普通链的思路仍然可适用于毛边的推理过程，作为其中的一环，只是更多地，我们会拆解视角以避免这种重合节点推理的普通链的奇怪现象的发生。

### 合理的整合 <a href="#reasonable-integration" id="reasonable-integration"></a>

那么，有没有合理一些的整合呢？答案是有的。整合成普通链的模式可用于删数的话，一共存在三种情况：

1. 整合为头尾均可删数的普通链；
2. 整合为可以看到删数的自我约束；
3. 整合为环，且其中一个弱链关系可以删掉删数。

这里我们拿其中一个来举例，因为三个都举例的话实在是有点啰嗦了。

<figure><img src="/files/wzVVoT4FJs9rWY5bDFZk" alt="" width="375"><figcaption><p>毛边唯一矩形类型 3</p></figcaption></figure>

如图所示。如果我们假设 `r7c1(3)` 和 `r8c4(3)` 同假的话，因为 4 在 `c14` 里都只能填在这四个单元格 `r45c14` 里，所以此时 3 也不在的话，那么 `r45c1` 就形成隐性数对，而右边为了规避也只是隐性数对（出现唯一矩形的矛盾），所以借用 `c4` 上的 9 的共轭对关系，我们可以得到 `r23c4` 只能填 3 或 9 的结论（因为其中一个单元格填 9，另外一个必须填 3，否则 3 只能放在 `r45c4` 里，然后就真成关于 3 和 4 的隐性数对了，就矛盾了）。

因此，这个时候，删数是 `r23c4 <> 2` 和 `r3c4 <> 1` 这三个数。不过这个题删不了 `r3c4(1)` 这里就不展示了。

和前面逻辑一样，我们依旧讨论两个毛刺 `r7c1(3)` 和 `r8c4(3)` 的真假性。显然也是四个情况（就两个候选数，组合起来肯定是 4 个情况），当他们同假的时候，有唯一矩形类型 3 如上面解释那样删数，所以它独自成一个情况；而其他三种填数模式的组合，我们均可以将其模糊地认为是一个强链关系。

然后我们就有下面的这条链：

<figure><img src="/files/oB1UCjruUuc2AOxWw8pK" alt="" width="375"><figcaption><p>利用了毛边的自我约束</p></figcaption></figure>

如图所示。链的写法如下：

```
2r9c4=3r8c5-3r8c4=3r7c1-3r7c3=7r7c7-7r9c7=2r9c4
```

这一次我们就可以直接使用普通链的思路得到我们想要的结果。这是一条自我约束，从 `r9c4(2)` 假设为假起头，绕一圈回到自己得到其为真的结论。因为之前说过这种特殊的不连续环逻辑，因为证明一圈发现和自己的假设相反，所以自身的原假设肯定就错了。因此 `r9c4(2)` 为真是正确结论（假设为假绕一圈得到为真，和原假设矛盾，可不就只能为真了么）。

像是这种情况我们就可以整合为链。与其说整合的，不如说它就可以这么用。整合反而多余了（因为也压根没必要拆视角了）。

## 弱链毛边 <a href="#weak-kraken-link" id="weak-kraken-link"></a>

之前我们看了两个例子，知道毛边的推理方式是利用四个情况的“1 + 3”分成两组，其中一组单列出，另外一组用强链关系构建。我们把这种构造出来的强链毛边关系称为**强链毛边**或**强毛边**（Strong Kraken Link）。之所以我在这里提这个，想必大家都猜到了，有强肯定就有弱。下面我们来看**弱链毛边**（或者叫**弱毛边**，Weak Kraken Link）是怎么用的。

<figure><img src="/files/YmbjnlErDv3MWMEB4vQC" alt="" width="375"><figcaption><p>弱毛边同真构造的强制链</p></figcaption></figure>

如图所示。之前我们是同假则有什么东西出现，这次我们同真试试看。

可以发现，如果 `r4c2(1)` 和 `r6c7(1)` 同真的话，则 `r7c27(1)` 直接被排除，于是可得 `r7c7(9)` 为真，这里只是象征性画出链的起点，然后接入到 `r7c27(1)` 上。然后跟着链走，可以到 `r2c9(7)` 为真，所以这个情况是可以删除 `r2c2(7)` 的。

<figure><img src="/files/yOPxN2jXkX22CRCFjZJG" alt="" width="375"><figcaption><p>弱毛边构造环</p></figcaption></figure>

如图所示。当两个毛刺 `r4c2(1)` 和 `r6c7(1)` 不同真时，一共有三种情况。不过这里也可以学强毛边那样不再细分，直接用弱链关系模糊表示出来即可。

于是，我们可以得到这么一个环。而这个环利用了弱链关系 `7r4c2-7r1c2`，所以 `r2c2(7)` 此时仍然可以删数。

所以总体来说，两种情况均可删除 `r2c2(7)`，故结论就是 `r2c2 <> 7` 了。

可以看到，这个例子用到的弱链毛边关系证明删数成立用到的是环，即前面提及的第三种情况。只是说，这个例子看着有些模糊，因为同真和不同真的两种状态都用了链，所以有些分不清哪边是主、哪边是次。

## 毛边技巧的命名 <a href="#naming-rule-of-kraken-link-techniques" id="naming-rule-of-kraken-link-techniques"></a>

当你无法辨认一个利用了毛边的技巧叫什么时，我们应找出讨论期间两边（同真/不同真，或者同假/不同假）的主次关系。其中，**主关系发生在不使用毛边那一边，而次关系发生在使用了毛边的那一边逻辑上**。所以前面三个例子，第一个例子（强毛边）不使用毛边的情况是显性数对，第二个例子（强毛边）不使用毛边的则是唯一矩形类型 3，第三个例子（弱毛边）不使用毛边的情况则是普通链，所以这三个技巧分别称为毛边显性数对、毛边唯一矩形类型 3 和毛边链。

依赖强弱毛边的情况，只是为了证明删数成立而诞生的特殊分支。所以我们把这个定义为次要部分。而且，次要部分一定会使用链（整合后一定是前面提及的三种情况的其中一个，要么环要么链），所以我们命名毛边技巧的时候肯定不能参考它，不然就没意义了不是。

好了，至此我们就把毛边的基础内容介绍完了。下一节我们将继续来看毛边的一些实际用例。


# 毛边的使用

Usage of Kraken Link

下面我们来看一些例子。

## 例子 1：毛边融合待定数组 <a href="#example-1" id="example-1"></a>

<figure><img src="/files/sLuR1nP5Zx3XnhVkA6XB" alt="" width="375"><figcaption><p>毛边融合待定数组</p></figcaption></figure>

如图所示。当如果我们忽略 `r3c6(23)` 的存在的话，那么五个单元格 `r3456c6` 和 `r5c4` 将构成一个标准的融合待定数组，于是所有 1、4、6、7、9 在所在的区域都可以进行删除。

但是很遗憾，他们客观存在。我们无法消除他们，所以值得讨论真假性。将两个候选数当成毛刺看待，于是有四个可能的填数情况。因为同假可以形成结构，所以我们将其分为同假结构和不同假强链的两个情况考虑。

当不同假时，这两个候选数将自动形成强链关系，于是我们可以构造出这个不连续环：

<figure><img src="/files/d4a6QB3Yhz2ekaCjK9vY" alt="" width="375"><figcaption><p>强毛边构造不连续环</p></figcaption></figure>

如图所示。链表示如下：

```
5r4c4=(5-2)r4c2=2r8c2-2r8c5=2r2c5-(2=3)r3c6-(3=4)r3c4
```

于是我们可以知道此时 `r4c4 <> 4` 的结论。也就是说可以因为强链毛边关系构成后得到这个删数结论成立。

但是，因为此时 `r4` 具有 4 的共轭对，所以 `r4c6 = 4` 会在 `r4c4 <> 4` 时同步得出。也就是说，强毛边构成时也可以直接得到 `r4c6 = 4` 的结论。

所以，`r2c6(4)` 不论在毛刺同假（融合待定数组成立）还是毛刺不同假（强毛边构成），都可以删除，所以这个题的结论就是 `r2c6 <> 4`。

> 本教程省略了 `r4c46(4)` 共轭对得到 `r4c6 = 4` 造成 `r2c6(4)` 删数的这一幅图。

## 例子 2：毛边摩天楼构造链 <a href="#example-2" id="example-2"></a>

<figure><img src="/files/FoPPFB2PCyarOz2B0Bgx" alt=""><figcaption><p>毛边摩天楼构造删数并延长</p></figcaption></figure>

如左图所示。当 `r2c36(3)` 同为假的时候，我们会有摩天楼，并得到 `r9c1 <> 3` 的结论。得到这个删数因为无法用于后续的结论析取（联立后得出删数结论），所以我们继续延长，和前面分步那样继续延伸一下。

现在看右图。我们从 `r9c1(3)` 为假出发可得到 `r5c2(1)` 为假的结论（因为 `r9c1(3)` 会顺着假设走到 `r7c2(1)` 为真的结论，所以这个结论是可以得出的）。

也就是说，当毛刺 `r2c36(3)` 同假时，有摩天楼成立并最终产生 `r5c2(1)` 的删数结论。这是这一个情况。下面我们来看毛刺不同假的情况。

<figure><img src="/files/Z5JMVoxPZ1egPmrI1mMS" alt="" width="375"><figcaption><p>强毛边构造出异数链</p></figcaption></figure>

如图所示。当强毛边成立时有这么一条链：

```
5c5c3=(5-3)r2c3=(3-7)r2c6=7r5c6-7r4c45=2r4c8-2r6c9=5r6c7
```

于是造成删数 `r5c8 <> 5`。不过，因为 `r5c8` 此时是双值格，所以可得 `r5c8 = 1` 的结论。因为此时 `r5c8 = 1` 成立，所以 `r5c2` 也不能填 1。因此，强毛边这个情况成立时候也可以得到 `r5c2 <> 1` 的结论。所以，这个题的结论就是 `r5c2 <> 1`。

> 和前面那个例子一样，本教程也省略了 `r5c8(5)` 删数可得到 `r5c8(1)` 为真，进而删除 `r5c2(1)` 的这一幅图。

## 例子 3：毛边伪数组构造链 <a href="#example-3" id="example-3"></a>

<figure><img src="/files/iB4y5B3UbiGxeeDGluAn" alt="" width="375"><figcaption><p>毛边伪数组</p></figcaption></figure>

如图所示。如果我们忽略 `r3c6(4)` 和 `r6c6(9)` 两个候选数的话，此时 1、2、3、7 四个数字在 `r356c6` 和 `r5c5` 四个单元格里将构成伪数组结构，但是不能用于删数，因为 7 这个数字的摆放实在是有点“毒辣”。于是我们还是借用前一个例子那样，延长推理。将数字 7 考虑用强链串起来。

<figure><img src="/files/6SeyjHpCVDleTTDojvP6" alt="" width="375"><figcaption><p>伪数组构造强链关系，引出连续环</p></figcaption></figure>

如图所示。于是我们就有这样一条链结构，头尾成环。此环可以删除 `r2c5(7)`。

这是当两个毛刺同为假的情况。如果毛刺不同假，则构造强链毛边关系，于是我们又可以找到这么一条链：

<figure><img src="/files/Afc2CMge1OUNU9fgRG8p" alt="" width="375"><figcaption><p>强毛边构造的毛刺数组链</p></figcaption></figure>

如图所示。当不同假时我们有这个链构成，于是删数仍然囊括 `r2c5(7)`。所以这个题的结论就是 `r2c5 <> 7`。

## 例子 4：毛边对交空矩形构造链 <a href="#example-4" id="example-4"></a>

<figure><img src="/files/N4uF21GxllfAekTkLdp2" alt="" width="375"><figcaption><p>毛边对交空矩形</p></figcaption></figure>

如图所示。如果我们忽略 `r8c5(8)` 和 `r9c9(4)` 的话，此时我们可以利用 `r6c7(49)` 和 `r8c5(49)` 配合 `b9` 将构成对交空矩形结构。还记得这个技巧吗？在之前我们介绍过，它的本质逻辑是串起来的区块环。所以这个技巧可以产生的删数是 `r8c2(4)`。

不过这个删数没有用，后续推理无法用这个数。所以我们需要延长。

<figure><img src="/files/5oBv6BYl6jTxc1fKrLEu" alt="" width="375"><figcaption><p>利用待定数组延长</p></figcaption></figure>

如图所示。于是我们可以得到 `r2c2 <> 1` 的结论。这是毛刺 `r8c5(8)` 和 `r9c9(4)` 同假的情况。

<figure><img src="/files/VbTAhUhUmy0C3OvGP70R" alt="" width="375"><figcaption><p>强毛边构造异数链</p></figcaption></figure>

如图所示。当毛刺不同假时，我们可以构造出强毛边并得到这个异数链。这个异数链头尾也可以删除 `r2c2(1)`。

所以，这个两个情况均可删除 `r2c2(1)`，因此题的结论就是 `r2c2 <> 1`。

## 例子 5：毛边显性数对构造链 <a href="#example-5" id="example-5"></a>

<figure><img src="/files/FPir2zLXDsTGgGZkViF0" alt="" width="375"><figcaption><p>毛刺同假的情况</p></figcaption></figure>

如图所示，我们把 `r8c2(6)` 和 `r9c2(7)` 视为毛刺时，同假则形成 3 和 8 的显性数对，于是可以找到这么一条链，并得到最终 `r9c5(7)` 为真的结果。

<figure><img src="/files/rz5rQzCk2D5RoIZcBrSb" alt="" width="375"><figcaption><p>毛刺不同假的情况</p></figcaption></figure>

如图所示。当毛刺不同假时引出强链关系，于是我们可以构造出图中的环结构，也可以删除 `r9c3(7)`。所以这个题的结论就是 `r9c3 <> 7`。


# 毛刺环和毛边环

Kraken Burred Loop & Kraken Linked Loop

前面我们花了几篇内容介绍了基础的毛刺和毛边的用法。下面我们来补充几个带环的例子。之前毛刺和毛边的技巧命名已经提过，毛刺和毛边技巧搭配的结构是看当毛刺均为假时才会产生的结构，把他称为毛刺的对应技巧。下面我们来看，毛刺环和毛边环（毛刺为假时会有环）的一些使用方式。

## 例子 1：毛刺 ALS-XZ 环 <a href="#example-1" id="example-1"></a>

让我们从一个轻松写意的毛刺环出发，学习今天的内容。

<figure><img src="/files/PPvI1CoBszSEDw19AgYA" alt="" width="375"><figcaption><p>毛刺 r4c2(3) 为假有 ALS-XZ 环</p></figcaption></figure>

如图所示。当 `r4c2(3)` 作为毛刺来看的话，需要讨论真假性。

如果它为假，那么我们可以找到一个双严格共享候选数的待定数组 XZ 技巧（再不说这名字都快忘了）。因为有这么个技巧，所以所有弱链可以删数，所有待定数组用到的其他数字也均可以用于删数（视为数组），所以可以找到很多删数。

> 图中标注的是其中一部分删数，因为这些删数仍然可以用在毛刺真时作为删数出现，所以其他的就不展示了。

<figure><img src="/files/bGRQuyWwyjFeupl3apwp" alt="" width="375"><figcaption><p>毛刺 r4c2(3) 为真时有连续环</p></figcaption></figure>

如图所示。当毛刺 `r4c2(3)` 为真的时候，我们可以得到 `r9c2 <> 3`（直接排除），于是就有了图中这个连续环（因为 `r9c2(3)` 不存在之后，`r39c2` 就构成了一个待定数组，于是就有 `4r3c2=6r9c2` 的强链关系了）。

因为两种情况的删数我们需要用于取交集，而对于毛刺真的情况也可以删除上一幅图里给的那些，所以这个题的删数就是这一些了。

## 例子 2：毛刺欠一数对构造环 <a href="#example-2" id="example-2"></a>

这是一个复杂的例子。下面我们逐步拆解介绍，避免你看不懂这个例子。

### 毛刺为假的情况 <a href="#when-burrs-are-false" id="when-burrs-are-false"></a>

<figure><img src="/files/Nl06KCUjJJigaWV8S5PU" alt="" width="375"><figcaption><p>毛刺 r13c2(1) 为假时的欠一数对构造环</p></figcaption></figure>

如图所示。假设此时我们将 `r13c2(1)` 视为毛刺，那么我们可假设他们为假后构成这个连续环。这个构造的连续环比较难以理解的地方只有构造出来的弱链关系 `1r2c7-5r2c4`。这个需要借助的是欠一数对。

<figure><img src="/files/pMWaUckGxTrtZ8i0TXcA" alt="" width="375"><figcaption><p>弱链同真时欠一数对矛盾</p></figcaption></figure>

如图所示。当我们尝试假设这两个候选数同真时，由于我们尝试假设了毛刺 `r13c2(1)` 为假，所以 `b1` 的 1 和 5 无法合理地放进去，因为 1 和 5 均作排除后都只能填在 `r1c1` 里，但一个单元格不可能填两个数，所以矛盾了。

> 什么？你问我这为什么是欠一数对？来人，这有一个跳着学的人，把他拖回去重新学！

顺带一说，这个图我忘了标删数了，但是因为制图太过麻烦所以这里就不改了。不过你可以先自己思考一下这个毛刺为假构成的这个连续环都能删除哪些数字。请自己思考一下再看后面的内容，因为后面展示的毛刺为真产生的删数会“剧透”给你删数的具体位置。

### 毛刺为真的情况 <a href="#when-burrs-are-true" id="when-burrs-are-true"></a>

下面我们来看毛刺为真的情况。这个题毛刺为真会稍微复杂一些。

<figure><img src="/files/CiY4kOr2QiZlU6Od5I0V" alt=""><figcaption><p>毛刺为真引发的延伸的线路 1</p></figcaption></figure>

如图所示。我们从毛刺 `r13c2(1)` 为真进行出发，当走到 `r5c9(3)` 的时候此候选数为真。这里我们就有两个走向了。上面展示的四个不同情况而造成的删数是其中第一个走向。

之前我们提到过，我们要找的删数是取毛刺真和假两种情况均可删的候选数。而这个题比较奇特的点在于，毛刺为假的那个环删数非常多，那个情况包含的一些删数在这个情况的这些走向都可以用来删，所以我为此拆了四个图给各位理解。不对，是五个图，因为这是第一个走向的四个不同删数的情况。这个走向经过 `r5c9(5)`，然后往下逐步展开延伸。

下面我们来看路径 2。

<figure><img src="/files/P58s9bzEz8POtZLtCGGs" alt="" width="375"><figcaption><p>毛刺为真引发的延伸的线路 2</p></figcaption></figure>

如图所示。这是第二个线路。当走到 `r5c9(3)` 为真时，我们走 `r23c9(3)` 为假的这个路径，于是可以得到 `r23c9(47)` 的毛刺显性数对为真。

所以，整合毛刺为真的情况，我们会连续得出 7 个删数。这 7 个删数全部是毛刺为假那个欠一数对构造环里可以删的数字，所以这个题一连可以删这 7 个。

### 为什么 r1c1(2) 和 r2c5(1) 可删？ <a href="#why-2r1c1-and-1r2c5-can-be-removed" id="why-2r1c1-and-1r2c5-can-be-removed"></a>

下面我们回到欠一数对构造环。我知道你肯定有两个删数理解不了。就是 `r1c1(2)` 和 `r2c5(1)`。这个删数在毛刺为真的时候可以轻松删除，但毛刺为假的这个连续环似乎并没有走到这里，为什么这俩也能删呢？

我记得我在讲环的时候说过一点。欠一数对其实是一个区块环的结构。这里欠一数对的完整连接方式被我们省略了（我们只保留了图中的异数弱链关系），所以才导致看不懂的。其实他的完整走法是这样的：

<figure><img src="/files/7vUWGjLqzExIFyTA0w3C" alt="" width="375"><figcaption><p>弱链关系可以这么展开</p></figcaption></figure>

如图所示。当这么展开后我们就知道弱链多出来了哪里：`r1c1(1)` 此时为真，所以 `r1c1(5)` 为假，所以弱链关系经过了 `r1c1`；而 `r2c7(1)` 为真时，可以得到 `r2c1(1)` 为假，所以弱链关系用到了 `r2`。这便是为什么删数多了两个看起来不太好懂的地方。

当然了，如果你非要使用欠一数对的视角来看也可以知道为什么能删它俩，因为 1 和 5 不同真，而嵌入环之中值得保证两端只有一端为真（一真一假），所以讨论一下：

* 如果 `r2c7 = 1`，则 `r1c1` 填 1，可删 `r1c1(2)` 和 `r2c5(1)`；
* 如果 `r2c4 = 5`，则 `r1c1` 填 5、`r2c1` 填 1，此时也可以删除 `r1c1(2)` 和 `r2c5(1)`。

不管你怎么理解吧，总之肯定是可以删除的。

## 例子 3：毛边区块连续环 <a href="#example-3" id="example-3"></a>

看够了两个毛刺环，现在我们来看毛边环。

<figure><img src="/files/WYag3w1Z7tRXLvwFjiEC" alt="" width="375"><figcaption><p>毛刺 r6c57(1) 为假时有区块连续环</p></figcaption></figure>

如图所示，可以看到，如果假设毛刺 `r6c57(1)` 为假时，可以构造出一个区块连续环的结构。可以删的数字有很多，图中标注的是可以用于整题结论的数字。

需要注意的是，`b3` 这几个标注了颜色的格子看起来稍微有点绕，先是进来到 `r3c789(9)` 为假，所以根据 `r3c4789` 的待定数组可得 `r3c9(3)` 为真。然后利用单元格内弱链的特性得到 `r3c9(5)` 为假，然后继续走 `r6c9(5)` 为真，这么从 `b3` 出去的。

当毛刺不同假的时候，我们可以构造强链毛边关系，于是就有这么个双线风筝：

<figure><img src="/files/VMLO63d5df8YaDqyhZ9s" alt="" width="375"><figcaption><p>毛刺不同假时得到的强毛边双线风筝</p></figcaption></figure>

如图所示。此时可以得到 `r2c7(1)` 为假。

<figure><img src="/files/QXjcRJMvbYg4fXmicxvQ" alt=""><figcaption><p>延伸 r2c7(1) 可得到的删数</p></figcaption></figure>

如图所示。当我们认定 `r2c7(1)` 后，因为不能得到前面给的那些删数，所以需要延长。

当 `r2c7(1)` 为假时可得 `r3c9(3)` 为真，这里是借用的 `r2c78` 和 `r3c789` 的待定数组得到的。然后因为 `r3c9(3)` 为真，自然同一个单元格里就不能填别的数了，所以 `r3c9(69)` 为假（删数）；与此同时，因为 `r3c9(5)` 为假，所以我们可以走出 `b3`，然后到 `r6c9(5)` 为真，于是 `r6c9(2)` 也为假（删数）。

所以这三个候选数删数逻辑均可得到。

## 结构节点的真假性讨论 <a href="#how-to-determine-whether-a-pattern-node-is-true" id="how-to-determine-whether-a-pattern-node-is-true"></a>

### 何为结构节点为真或为假？ <a href="#what-is-state-of-a-pattern-node" id="what-is-state-of-a-pattern-node"></a>

前面的内容里我们已经完整介绍了毛刺和毛边的几乎所有内容，下一节会开始讲这个思路的诞生历史以及命名上的一些内容。为了衔接之后的一些内容，这里需要补充一个非常重要的点。**结构节点**（Pattern Node）。结构节点是区块节点的延伸，而对于待定数组这种情况，就不属于结构节点，仅属于区块节点。

那么什么是结构节点呢？结构节点指的是，将一些数独技巧直接纳入链的推理，并且自身会参与真假性假设（成立或不成立），强行产生的一种节点类型。

举个例子。我们拿之前的毛刺例子来说。

<figure><img src="/files/25XklAiSOvTiwQgZi5Hs" alt="" width="375"><figcaption><p>毛刺 r6c9(6) 为假</p></figcaption></figure>

如图所示。这是毛刺为假的情况。

<figure><img src="/files/dn1v6FgjeusqN3l18QXB" alt="" width="375"><figcaption><p>毛刺 r6c9(6) 为真</p></figcaption></figure>

如图所示。这是毛刺为真的情况。

这个例子是提取自之前毛刺 XYZ 半环。那个例子里，我们是按毛刺分开看的视角。如果我们想要强行将其改造为一条早期学到的普通链的话，那么我们就需要将这个 XYZ 半环作为一整个节点纳入推理过程，于是这个链的写法就变为了这样：

```
145r6c69|r8c9|r9c67=6r6c9-(6=4)r6c7
```

图我就不重复做了，因为就是把前面的链给并到一个图里而已。大概就是想表示，当 XYZ 半环整体纳入之后，就是它自己和毛刺 `r6c9(6)` 形成强链关系。

说一下这个的意思。当我们强行将 XYZ 半环作为一个节点看待时，此时它是不包含毛刺 `r6c9(6)` 的。或者当它不存在于结构之中。虽然它客观成立，但是我们为了让推理可以进行，强行拆成了毛刺和结构本体两部分来看。那么，起头的这个强链关系就意味着 XYZ 半环和它的毛刺 `r6c9(6)` 不同假。

什么叫不同假呢？XYZ 半环是个结构，我们认定它的真假性为成立或者不成立。也就是说，一个技巧成立，那么它作为链的节点时就认为是为真的；反之，如果一个技巧结构不成立，那么它相应地就会被视为为假的状态。

为真很好理解，就是毛刺不存在的时候结构合法呗。那么什么叫结构为假呢？结构为假的意思大多数时候指的是结构不可稳定存在，比如外来的一个或一些候选数的填写，或者是结构内部的一个或一些候选数凭空消失后，造成结构无法稳定成立的状态。比如说这个 XYZ 半环，要让其成立，那么 XYZ-Wing 的部分和强链的部分就都不可少；如果我们用了特殊办法将其中的单元格给填上了其他数字（比如这个例子 `r6c9` 填了 6 之后，就再也拿不出合理的 XYZ-Wing 结构形成了），那么 XYZ 半环无论如何都无法再成立了，此时我们就称为这个技巧结构不成立（为假）。

那么这么去想的话，那么毛刺显然就和结构本体是强链关系了，因为当毛刺为假时，结构直接就成立了（因为少了毛刺之后，结构必需的部件全部齐全，所以结构此时会客观成立），所以结构直接为真，因此我们就认为是这个毛刺和结构本体形成强链关系。

换言之，借用逆否命题将链路反转，当 XYZ 半环不成立（为假时），就必须有毛刺 `r6c9(6)` 为真，因为它是唯一一个在这个题里可以破坏结构、使其不成立的地方。所以它必须此时为真，XYZ 半环才会被破坏，所以我们把这种现象称为为假，仍然可以知道毛刺此时为真，故仍然是强链关系。

### 结构节点如何看删数？ <a href="#how-to-find-eliminations-from-a-pattern-node" id="how-to-find-eliminations-from-a-pattern-node"></a>

那么结构节点的删数怎么看呢？所谓的看链的两头的删数的交集，当一个节点为真时可以造成的删数，就是节点的删数（这不废话吗）。

当如果一个节点为区块节点时，我们需要考虑的地方只有一个：它的删数是什么。当结构作为节点的时候其实和它在普通情况下完全一样，也是视为普通的结构，然后去找删数就行。比如 XYZ 半环的删数包含这个题里的 `r6c1(4)`，那么它就是链头可以造成的删数（的一部分）；而链尾是 `r6c7(4)`，所以造成的删数则是整个行列宫以外其他位置的候选数 4。

这么看的话，其实找交集就行。对于这个题而言，你可以认为是两个节点自己删数的候选数集合的交集，你也可以稍微认为是这个 `r6c7(4)` 和 `r6c69(4)` 可以用于删数的交集。为什么是 `r6c69(4)`？因为 XYZ 半环可以删数，还能被链尾所看见的删数，要用到的结构的数字就是这两个。

所以，这里我们就可以得到两个说法：

* **结构节点和它可造成的删数形成弱链关系**；
* **结构节点和它的毛刺形成强链关系**。

这两点足以胜任几乎所有的场景。虽然说起来很轻松，但是还是需要你自己知道为什么。

### 结构节点远比你想象得要复杂 <a href="#extra-consideration-on-pattern-nodes" id="extra-consideration-on-pattern-nodes"></a>

实际上，结构节点远比你想象得要复杂。对于前面的例子来说，我们其实就是把技巧直接纳入推理。但是对于毛刺环和毛边环而言，非要强行纳入推理的话，也不是不行，但需要注意的一点是，它此时的结构节点就是一个真正的环。换言之就是，毛刺环其实等于说是一个**结构链**（Patterned Chain），即带结构节点的链，而结构节点自身是一个环。

不信你可以细细揣摩一下我这句话想表达的意思。环为假时有毛刺为真（或者倒过来，毛刺为假时环为真）。是不是细思极恐？


# 毛刺、毛边的由来历史和翻译

Naming & History of Kraken Logic

前面我们已经充分介绍了毛刺和毛边的使用方式和参考用例。还是按老规矩，我个人习惯提及一些关于历史由来和翻译的补充信息，防止遗忘。

## 个人理解 <a href="#personal-interpretion" id="personal-interpretion"></a>

我个人觉得这个毛刺和毛边的思想虽然并不带有新的数独技巧的知识点信息，但它更多展示了一种思维，可以灵活使用毛刺和毛边的推理思路。如果你非要强制性去看完整的链结构，实际上毛刺和毛边也是可以转化的，换言之，它可以将毛刺真和假的两种情况，将两头以强弱关系接入和归并，最终合并成一条链。但是有些时候，看一条链要么逻辑存在冗余，要么就是非常不便于理解，要么就是有些合并之后甚至会产生动态链和动态环的情况（尤其是用作删数判别尤为复杂）。比如合并之后可能会存在“一个候选数和一个融合待定数组结构成强链关系，然后它的删数和融合待定数组则又形成弱链关系”这样的特殊强弱关系。

这种用法非常神奇，但也为我们对链的完整理解而言造成了干扰。我在初学这个技巧的时候是按照合并为整条链的思路去学的，这导致了我走了很多弯路。包括早期一版的 PDF 格式的教程文档里其实也可以看出我对这个技巧的理解也只是停留在完整链路思维上。毛刺和毛边的思想本质是将一些复杂的链路逻辑拆解视图，从一个拆成两个，降低动态链等思路的复杂程度，方便理解的同时还提供了一个方便的视角。

## 历史 <a href="#history" id="history"></a>

这个思路早在 2014 年就有人提出。在中国大陆，这个年代还比较盛行一个叫做贴吧的论坛。截止我写完这篇内容，已经过去了 11 年的历史。

一位叫做 borescoper（本人则自称自己为“探长”）的网友在贴吧里发布了一篇名为“拓展思路：不完美连续环和不完美SDC（连续环+1，SDC+1）”的帖子，其中将连续环和融合待定数组技巧的“附加部件”（就是毛刺）作了一个描述和延伸，使其发挥链的作用。因为这个技巧在帖子里称为毛刺，因此这种思路也就沿用了毛刺的这种说法。

作者本人倒是比较低调，在时隔一年之后，发布了毛边的思路，将毛刺的多情况设定分类为强链关系/弱链关系和同假/同真状态，将四个排列组合的情况一下简化为了两个，解决了复杂的找寻逻辑。

* 毛刺：<https://tieba.baidu.com/p/3113172786>
* 毛边：<https://tieba.baidu.com/p/3933387019>

尽管时代变迁，尽管数独技巧越来越多（截止写这篇内容都已经 300 多种数独技巧了，哪怕除去各种技巧只是叫法不同但用法相同的子类型，算下来也有个几十上百种），但毛刺和毛边的思想确实是“经久不衰”。

> 顺带一说。请你记住这个名字，这个名字以后还会再次出现*多次*。

## 命名 <a href="#naming" id="naming"></a>

这个技巧的命名分两部分：中文和英文。其中文的名称就叫毛刺和毛边思想，所以问题主要出在英文这一块。

最开始的 1.0 版本，我将其翻译为“+1 technique”和“+2 technique”，即结构上多出一个或者两个候选数。包括作者本人其实也是在最开始毛刺的描述内容里这么说的。我个人觉得是因为学习了国外的数独叫法（全双值格致死解法 + n，即 BUG + n 这种说法）。不过这个说法有个问题是，由于 +1 和 +2 只是单纯利用了候选数的多出来的数量来辨识使用情况，这并不完全等价于毛刺和毛边思维。尤其是毛刺，多个毛刺仍然可以在不用毛边的情况下解释，所以无法正确解释出中文毛刺的说法。所以后来就更新了一版说法。

进入到 2.0 版本后，我将这个技巧翻译为“burr technique”和“bi-burr technique”，其中 burr 的中文意思就是“毛刺”，就是真正的毛刺的那个英文对应词。也就是说，我使用了直译来翻译这个技巧名称。这本身并没有什么问题，因为一些固有概念使用直译的形式有些时候往往可以代表一种独特的理念。虽然这是英语，我们应该考虑老外对这个技巧学习的心情，所以翻译的时候应该尽量采用意译，但架不住这个技巧它确实不太好去翻译它，所以使用了 burr 直接称呼毛刺。同时，我使用 burr 的过去分词 burred 称呼其代指的毛刺结构，如毛刺数对（Burred Subset）。这个说法几乎没有问题，但还是有点小毛病，也就是 bi-burr。毛边是使用搭桥的形式在呈现强弱关系的核心思路，而 bi-burr 仍然是数数，两个叫 bi-burr、三个叫 tri-burr、四个叫 quadra-burr，凡是涉及到数数的行为，就已经脱离了毛边使用强链弱链关系搭建推理流程的思维了，所以这一个版本的 bi-burr 的说法被取消了。

转到 3.0 版本，也就是现在的这个版本。教程采用了更稳妥的翻译，即使用了一个超纲的说法：kraken。对于 kraken 这个单词而言，它在数独技巧里还真有来头。它专门指代鱼这个数独技巧里，鱼的鱼鳍无法直接作用到删数上，而必须加入链的思路。这则和我们这里毛刺加入链的思路如出一辙。都不能说如出一辙了，简直就是一模一样。但是，这个说法有两个问题：一来是超纲了（还没解释过呢，就先用了）；二来是怎么用一个单词区分出毛刺和毛边两个用法。我给出的答案是，将毛刺翻译为“Kraken Burr”，而毛边则翻译为“Kraken Link”，即加入一个新的单词 burr 和 link 区分。另外，burr 也可以使用 fin 来代指，即之前的鱼鳍的概念。fin 这个叫法早在鱼的板块里就说过了，它代指的就是鱼上面多了那么一坨影响结构成立的东西。虽然鱼鳍并非涉及添加额外的强制链，但概念和理念是一样的，因此这里我个人认为 kraken fin 和 kraken burr 应该更贴切一些，而且两种说法都 OK，本教程采用这个叫法；另外 link 对应了英文里强链 strong link 和弱链 weak link 的叫法，因此看到 kraken link 就应该知道是多出来的一坨东西造成的 link 规则。

总之，本教程在经过语义变迁和个人的反复理解后，找到了一个我个人比较满意的答案。

## 重新审视毛刺和鱼鳍的区别 <a href="#review-difference-between-kraken-burr-and-fin" id="review-difference-between-kraken-burr-and-fin"></a>

为了严格对技巧的术语词区分开来，也避免叠加语义导致术语表达不严谨，而因为它的思路和鱼鳍完全一样，所以本教程严格按照是否添加强制链删数来区分他们：

* **鱼鳍：如果鱼鳍为真时可直接删数，且不需要借助任何额外候选数（构成强制链），就称为鱼鳍；**
* **毛刺：如果鱼鳍为真时不可直接删数，需要借助任意额外候选数（构成强制链），就称为毛刺。**

显然，这种规定下，不管是借助了单个的候选数，还是借助了一组候选数形成的结构（如毛刺为真时删除一个候选数，进而产生一个数对可删目标候选数），我们都称为毛刺。


# 鱼构造

Fish Construction

在解释完了比较复杂的毛刺和毛边后，我们来接着学习鱼技巧的构造。因为鱼自身结构的特殊性（跨多个行列），所以自身在使用链的时候就会出现非常复杂的思路的考量，所以我把他放在了这里。

## 毛刺鱼类型 1（Kraken Fish Type 1） <a href="#kraken-fish-type-1" id="kraken-fish-type-1"></a>

### 一个例子 <a href="#an-example" id="an-example"></a>

<figure><img src="/files/DOXBGd3FfEgkP5mwPWUl" alt="" width="375"><figcaption><p>毛刺鱼类型 1，结构部分</p></figcaption></figure>

如图所示。和之前的鱼几乎一致，这是一个二阶鱼结构，不过有一个鱼鳍长在了 `r3c2` 上。很遗憾的是，这个鱼鳍不导致任何删数的同时，本题的实际删数 `r1c7(4)`（稍后说明为什么可以删）和 `r3c2(7)` 的位置也不能互相看见，所以也就意味着它无法直接用于删数。

所以，我们需要动用毛刺的手段。将 `r3c2(4)` 视为毛刺，当其为假的时候，二阶鱼成立，于是删数也肯定就成立；而如果毛刺为真的时候，我们应当引出一条强制链，并假设其为真。可以发现它确实是可以删除的：

<figure><img src="/files/7OH8gBF9RUFB0KEKpPlR" alt="" width="375"><figcaption><p>毛刺鱼类型 1，强制链部分</p></figcaption></figure>

如图所示。可以看到，当假设 `r3c2(4)` 为真时，我们可以引出强制链并得到 `r12c9(4)` 区块节点为真的结论。

显然，`r12c9(4)` 可以删除 `r1c7(4)`；而结合毛刺为假的情况，因为 `r1c7(4)` 在毛刺为假时仍然可以删除，所以这个删数便是这个题的结论了。

可以看出，鱼也是可以纳入毛刺的计算范畴的。我们把这种嵌入毛刺的鱼结构称为**毛刺鱼**（Kraken Fish）。

### 毛刺及删数和鱼本体的关系 <a href="#relation-between-a-fish-and-kraken-burr-and-eliminations" id="relation-between-a-fish-and-kraken-burr-and-eliminations"></a>

可以从结构看出，它是很想将鱼纳入链的推理过程。但是奈何因为鱼本身规格比较大的特殊性，我们无法简易通过直接推导的形式将鱼纳入一个普通链里。

不过，前一节内容里我们提到，除了毛刺的视角外，我们还能强行将结构合并为一条普通链，只是带有结构的普通链罢了。比如这个例子里，因为毛刺为假，所以鱼可以成立，因此鱼和毛刺两部分可构成特殊的强链关系。当将鱼视为一个节点时，四个摆放位置需要合理进行排列，只要能使得鱼能形成删数状态，那么鱼便是成立的。举个例子，这个例子里的鱼用到的四个单元格是 `r39c37`。如果我们强行认定它是一个节点的话，那么强链成立，并将毛刺为真的这一截强制链和刚才强链关系合并到一个视图里，那么它就是一个链头为二阶鱼、链尾为区块节点的普通区块链。

如果按这种方式去理解的话，删数又是怎么理解呢？因为链的删数是看头尾的交集。而链头是二阶鱼，那么它可造成的删数显然就是本题里 `c37` 的其余单元格的候选数 4；而链尾则是区块，所以删除 `b3` 和 `c9` 里其余位置的 4。很明显，这两个情况均覆盖了 `r1c7(4)` 作为删数。所以，这么看的话，`r1c7(4)` 仍然是这个题的删数。

不过，要注意的是，鱼作为节点时，分析真假性非常痛苦，我们仅需要知道它可以和毛刺形成强链关系，以及删数是怎么看的，基本就足够了。

> 顺带一说，鱼鳍和删数可以直接对应（互相看得见对方），但它和毛刺本身区别仅在于看不看得见删数，所以，鱼本体和鱼鳍也可以形成如此的强链关系，所以并非是非得毛刺才行。只是说，鱼鳍和鱼的本体形成强链关系的这种说法本身就略显奇怪：因为鱼鳍本身就可以看到删数，所以并不需要加入额外的强弱关系去构造强制链并归纳删数逻辑。

另外，删数因为是鱼可产生的结论，所以当我们将鱼视为节点之后，鱼成立时即为真，那么删数处均为假，所以鱼和删数将构成弱链关系。总之，我们可以利用前一节的内容得到这样两个说法：

* 鱼本体和毛刺形成强链关系；
* 鱼本体和删数形成弱链关系。

后面我们再来详细探讨它作为节点的真假性。

### 另外一个例子 <a href="#another-example" id="another-example"></a>

下面我们来看一个混合毛刺和鱼鳍一起出现的情况。

<figure><img src="/files/ztL4SqiIcuBQwU3J83ba" alt="" width="375"><figcaption><p>毛刺鱼类型 1，另一个例子，鱼结构部分</p></figcaption></figure>

如图所示。这个题有一个鱼鳍和一个毛刺，鱼鳍是 `r8c6(2)`，而毛刺是 `r8c8(2)`。当毛刺为假的时候，那么二阶鳍鱼成立，于是删数是可以删的；而如果毛刺为真时，我们需要引出强制链。

<figure><img src="/files/CPjF9JTiJTpQJOfYRNsa" alt="" width="375"><figcaption><p>毛刺鱼类型 1，另一个例子，强制链部分</p></figcaption></figure>

如图所示。我们可以引出这么个强制链。写法如下：

```
2r8c8-2r79c7=5r179c7-5r3c7=5r3c5-5r1c45=2r2c4
```

这样我们可以得到 `r2c4(2)` 节点为真，所以照样可以删除 `r7c4(2)` 这个删数，所以这个删数是这个题的结论。

## 毛刺鱼类型 2（Kraken Fish Type 2） <a href="#kraken-fish-type-2" id="kraken-fish-type-2"></a>

下面我们来看另外一种利用毛刺的鱼结构的技巧用法。

<figure><img src="/files/ygPdLBQdZ3fJeTVTt2tI" alt="" width="375"><figcaption><p>毛刺鱼类型 2，鱼结构部分</p></figcaption></figure>

如图所示。可以从这个画法看出，鱼的删数甚至都无法删除到 `r8c3(1)` 这个数了。所以我们必须考虑用更复杂的逻辑。

<figure><img src="/files/BrQEaWcvJIjont6KCDCe" alt="" width="375"><figcaption><p>毛刺鱼类型 2，毛刺真的情况</p></figcaption></figure>

如图所示。如果毛刺为真，则我们可以引出这条强制链：

```
5r4c5-5r179c5=7r7c5-7r7c3=7r8c3
```

这样可以得到 `r8c3(7)` 节点为真，于是删数成立。

不过，更重要的是，毛刺为假的时候，就算鱼成立，我们也不能删除 `r8c3(1)`，毕竟删数的数字都不一样。但是我们这么去想：毛刺为假的时候，这个二阶鱼此时是成立的，于是所有跟鱼有关系的删数是可以成立的。比如说这个题里的 `r79c1(5)` 和 `r9c6(5)` 理应都可以删除。切记，这是毛刺假的时候鱼成立才能删的数。

当这些候选数在这个状态下删除后，我们再看 `c16`，此时就会变得特殊：因为二阶鱼的关系，原本可以填入很多位置的 5 此时仅剩下鱼可使用的两处位置（分别位于 `r1` 和 `r6` 上的这两种摆法），此时我们甚至可以构造出强链关系来用。也就是说，当毛刺为假的时候，我们可以构造出 `c1` 或 `c6` 上关于数字 5 的强链关系。于是，我们可以有这样的链：

<figure><img src="/files/JEjfBHA6P25Clh7aQPjw" alt="" width="375"><figcaption><p>毛刺鱼类型 2，毛刺假的情况</p></figcaption></figure>

如图所示。由于毛刺为假，所以我们可以构造出 `c6` 的强链关系，所以有这么一条区块不连续环：

```
7r8c3=(7-5)r8c6=(5-6)r4c6=(6-1)r4c1=1r45c3
```

这样我们仍然可以删除 `r8c3(1)`。所以，这个删数是这个题的结论。

下面我们再来看一个例子。不过这个例子会稍微麻烦一些。

<figure><img src="/files/lZR8cVmMv5Ve7R7vfVKD" alt="" width="375"><figcaption><p>毛刺鱼类型 2，另一个例子，鱼结构部分</p></figcaption></figure>

如图所示。这是一个四阶退化鱼，毛刺是 `r6c2(7)`。

<figure><img src="/files/2QcOzUItOIXwLhyNJ1GI" alt=""><figcaption><p>毛刺鱼类型 2，另一个例子，毛刺为真和为假的情况</p></figcaption></figure>

如图所示。左图是毛刺为真的情况，右图是毛刺为假的情况。可以看出，毛刺为假时有环的结构。注意 `c8` 的强链关系建立于毛刺为假时普通的四阶鱼成立，才有的强链关系，因为 `r7c8(7)` 此时肯定可以被删除，于是 `c8` 就只剩下 `r58c8` 两处可以填 7 的位置了。

## 毛边鱼 <a href="#kraken-linked-fish" id="kraken-linked-fish"></a>

看完了鱼的两种固有构造模式，下面我们来看一些灵活构造的方式。

<figure><img src="/files/AcOQO9QAP0PlIQv3uV8N" alt="" width="375"><figcaption><p>毛边鱼，毛刺同假的删数</p></figcaption></figure>

如图所示，这是一个毛边鱼结构。当毛刺 `r2c2(1)` 和 `r4c4(1)` 同为假的时候，`r9c7(1)` 可以删除。

<figure><img src="/files/fPlOeJbbe4dIZAIEeFva" alt="" width="375"><figcaption><p>毛边鱼，毛刺不同假时有自我约束</p></figcaption></figure>

如图所示。当毛刺不同假时我们可以构造出强链关系，于是可以找出这样一条自我约束，仍然可以删除 `r9c7(1)`。

## 鱼在连续环里的删数 <a href="#fish-eliminations-in-a-loop" id="fish-eliminations-in-a-loop"></a>

还记得前面的伏笔吗？下面我们来看看，鱼作为结构节点时的用法。

<figure><img src="/files/fB3I019ZTare7OwAvXP0" alt=""><figcaption><p>区块连续环里有鱼</p></figcaption></figure>

如右图所示。这是一个区块连续环，不过比较特殊的是，其中用到了鱼结构作为推导的其中一个部件。鱼的填数情况请参考左图。环的写法如下：

```
6r48c19=6r8c5-6r1c5=6r3c4-(6=1)r3c7-1r23c9=6r57c9-6r48c19
```

鉴于之前没有将鱼当成节点形式纳入链环的讲解，这里要解释一下它的推理过程。

我们不妨从 `r1c5(6)` 设为假开始。显然前面的强弱关系比较容易看，所以就跳过。当我们推导到 `r23c9(1)` 时，这个区块节点此时是为假的（前一个节点 `r3c7(1)` 是为真的）。因为 `r23c9(1)` 为假，所以借助 `r2357c9` 的待定数组，我们可以得到 `r57c9(6)` 此时为真。

因为 `r57c9(6)` 为真之后，二阶鱼 `r48c19(6)` 作为一个节点来看，就无法保证鱼可以形成可以用作删数的状态了。原本二阶鱼需要要求在 `r48` 两行里各自填入一个 6 且不造成矛盾（即行列重复填 6）。可问题是，当 `r57c9(6)` 为真时，四个单元格无论如何都填不出来不矛盾还能让鱼成立的形式，毕竟 `c9` 两处可填的位置直接都被我们干掉了。既然干掉了，也就意味着鱼节点不可能成立了，所以 `r48c19(6)` 这个二阶鱼节点此时为假。或者你这么理解：因为 `r57c9(6)` 是 `r48c19(6)` 这个鱼本体成立时可以造成的删数，而前文说到，鱼的删数和鱼本体是形成弱链关系的，所以利用逆否命题可以将此说法倒转过来：当 `r57c9(6)` 为真时，鱼本体的这个节点 `r48c19(6)` 为假。

而我们之前说过，鱼的本体和鱼鳍（毛刺）是形成强链关系的。对于此题而言，毛刺位置是 `r8c5(6)`。所以，因为此时我们得到了鱼本体是为假的，所以 `r8c5(6)` 需要为真（即利用其强链关系得到）。

从字面意思来看，这个说法其实并不好理解，凭什么鱼本体为假，这 `r8c5(6)` 就得为真？这有两个方式去理解。你可以选取下面随便哪一个进行理解。

第一种方式是采用逆否命题。因为我们知道，当鱼鳍（毛刺）为假时，鱼的本体是成立的，于是可以进行删数。所以换言之就是，鱼鳍为假，鱼本体就为真。所以他们构成强链关系，这一点之前提到过。而利用这个说法的逆否命题将逻辑进行倒转，我们可以得到，当鱼本体为假时，鱼鳍就为真。这是第一种理解方式。

如果你还是觉得数学描述非常晦涩，理解起来还是不够本质的话，你可以尝试用第二种方式去理解。第二种方式则是需要你去思考一下，鱼节点为假的状态都会有什么样的特效。鱼的本体要为假就说明鱼必须不能使得内部的排列有效。什么时候无效呢？比如这个题里，由于它是二阶鱼，所以一共会有四个可填位置。当鱼有效时，四个位置里恰好有两个位置不冲突地填写进去，只要他们行列不相同（互相看不见彼此）那么就是成立的。那么自然无效的话，就是取的这个说法的相反情况，也就是不让这个结构出现这种正确的填写模式。啥时候呢？

想一想，鱼有四个位置可填，所以列举出来也就五个情况：有 0 个位置可填（全部都不可填）、只有 1 个位置可填、2 个位置都填、3 个位置都填以及 4 个位置都填。很显然 $$\ge 3$$ 个位置都填的情况显然是不可能出现的（抽屉原理，一共才最多放俩，你放仨进去，那肯定就有行列直接矛盾了嘛）；填 2 个肯定也不行（不然不就直接有效了）。所以，唯一一种可以成立的只有可能是只剩下 0 和 1 处可填位置。

可什么时候鱼的本体能只填 1 处或者甚至一处都不填呢？有的兄弟，有的。把数给填在毛刺（或者鱼鳍）上，那么鱼的本体就会出现少于 2 次的填写次数。这逻辑不就串起来了嘛。所以，既然能有使得鱼不成立的状态，那要能继续推理下去，我们只能让这个数放毛刺上，这鱼的推理才能继续而且不会出现矛盾。所以，我们就得到了鱼的本体为假时，毛刺必须为真的原因。这是第二种理解方式。

不管你怎么理解吧，总之这个说法肯定是可以得到的。

当我们得到 `r8c5(6)` 为真时，`r1c5(6)` 就为假，此时环就绕回来了。因为环的强弱关系完全交替出现，所以这个题的删数就是所有弱链上可以删的地方。

是的，所有弱链上。刚刚我们就说到，鱼的本体和删数是形成弱链关系的，而鱼的删数自然就是本题里位于 `c19` 上的其余位置，所以这个题的结论里含有 `r9c1(6)` 这个删数。而 `r7c5(6)` 这个删数是 `c5` 的弱链关系，是普通的删数，所以这个题的删数一共有两处。

## 鱼节点的本质 <a href="#essential-of-fish-node" id="essential-of-fish-node"></a>

鱼作为节点时，我们利用了真假性讨论粗略地完成了对嵌入了鱼的链环的删数的理解。虽然这很麻烦，但是它的麻烦更多的原因还是来自于鱼本体跨了多个行列。如果它和之前学到的待定数组那样只涉及单个区域下的若干单元格的话，或者学学待定唯一矩形那样，就算跨了行列，但起码不影响删数推理，有一个比较简易的理解形式。而从本质来看，鱼节点其实是一个动态的节点。换言之，它需要走分支去归纳所有的走法。

比如刚才那个题目，当我们走到 `r57c9(6)` 为真时，我们是直接连到了鱼上面来的。但非从本质来看的话，我们其实是走了两个分支的动态链。其中分支 1 是认为此时 `r4c9(6)` 为假，然后 `r4c1(6)` 为真，然后 `r8c1(6)` 为假；分支 2 则是认为此时的 `r8c9(6)` 为假。因为两个分支的起始点 `r57c9(6)` 可以同时造成弱链分支的出现，所以两个分支最终得到的 `r8c1(6)` 为假和 `r8c9(6)` 为假其实也是同时可以得到的。这里说的“同时”，是真的同时。因为 `r8` 上还有一个可填 6 的地方，就是毛刺 `r8c5(6)`。因为同时得到 `r8c19 <> 6` 的结论，所以 `r8c5(6)` 此时为真。正是因为这么走了弯路，所以这个链的效果是一条动态链。哦不，这是个动态环。

那么，删数呢？我们之前说过，动态环的删数判断是需要考虑进行删数分析的，但我们给跳过了，因为鱼有自己的独特理解视角，所以我们相当于是用了上一层的视角去避免了底层的穷举步骤。当然，你非要穷举的话，这个题也是可以穷举出来的，最终仍然可以得到 `r9c1 <> 6` 的结论，不过这里我就不再讨论它了。

所以，**鱼节点的本质是动态，鱼作为节点的链就是一个标准的动态链，而在环里就是标准的动态环**。鱼的成立与否并不会影响分支上的删数（如 `r9c1(6)` 其实只属于分支 1 上可删的范畴，但整个环可以允许删去它），所以**带有鱼节点的动态环并不会影响动态环是半环还是全环的特征**；换言之，如果原本动态环是半环，那么嵌入鱼之后，半环还是半环（不会改成全环）；同理，如果原本动态环是全环，那么嵌入鱼之后，全环也还是全环（不会改成半环）。

至此，我们就把鱼的构造讲完了。下面我们将进入到绽放和牺牲的内容里。


# 绽放

Blossoming

今天我们要介绍一个全新的概念。这个概念其实早在之前就有所提及，但因为当初的难度较高，因此并未详细展开进行说明。

让我们先从一个非常基础的、有技巧名称的数独技巧切入，看看这是怎么一回事。

## 死亡绽放（Death Blossom） <a href="#death-blossom" id="death-blossom"></a>

在前面我们学到过待定数组的链，我们也学过强制链。下面我们来看一下待定数组结合强制链的运用。

<figure><img src="/files/zvhHvGnRnGoY84YcTWCZ" alt="" width="375"><figcaption></figcaption></figure>

如图所示。我们按单元格 `r7c4` 讨论三种情况。

* 如果 `r7c4 = 3`，则待定数组 `r3c4` 这个单元格只能填 2；
* 如果 `r7c4 = 4`，则待定数组 `r239c5` 三个单元格里只剩下 2、6、7，形成三数组；
* 如果 `r7c4 = 5`，则待定数组 `r2c45, r3c5` 三个单元格只剩下 2、6、7，形成三数组。

因为三种情况要么填 2，要么形成数组里含 2，所以所有 2 都可以用于删数。对于这个题来说，删数是 `r1c5 <> 2`。我们把这个技巧称为**死亡绽放**（Death Blossom），即使用单元格进行强制链讨论；然后每一个分支都映射了一个待定数组，每一个待定数组全部都可以删除同一个候选数或若干候选数的情况。

这个名字听起来怪吓人的，听起来并不适合作为本内容的切入。但是它因为需要带有分支的现象和特征，使得今天我们要讲解的内容挂钩了。

## 绽放环旧技新说 <a href="#blossom-loop-as-new-view" id="blossom-loop-as-new-view"></a>

### 先来看例子 <a href="#example" id="example"></a>

我们来看一个怪东西。

<figure><img src="/files/QjpmVlS7JTb0SVAbzrfw" alt="" width="375"><figcaption><p>绽放环，但是是之前的例子</p></figcaption></figure>

如图所示，这是之前 [动态环的删数分析](/chain-theory/11-dynamic-chain/03-elimination-analysis-on-dynamic-loop#blossom-loop) 里提供的一个例子。这个例子当时是要读者自己去理解，下面我们就用新视角来看这个例子。

<figure><img src="/files/bSLZOb1xoimBkXRXh8ZD" alt="" width="375"><figcaption><p>毛刺连续环</p></figcaption></figure>

如图所示。这是一个毛刺连续环，毛刺是 `r5c3(4)`。当毛刺为假的时候，我们可以得到图中的这些位置作为删数。很显然，他们都删不了，因为这些删数仅仅是当毛刺为假时才可以产生的删数。

很明显，要证明删数可得，必须要走毛刺为真的情况。于是我们就去找毛刺为真的可用路径。

<figure><img src="/files/7UEdL7MIcIgUqzhjSiAR" alt="" width="375"><figcaption><p>毛刺为真时的强制链</p></figcaption></figure>

如图所示。当我们假设 `r5c3(4)` 为真时，可以顺利得到 `r6c1(5)` 为真的结论。请注意，这个数之前是我们在毛刺连续环成立时所得的其中一个可用删数，它是毛刺假的删数，现在被我们得到它在毛刺为真的状态下为真了。

当我们在毛刺为真时推出连续环所产生的其中任意一个删数为真时，我们就把这个现象称为**绽放**（Blossoming）。当绽放现象出现时，有如下两部分可参与删数的地方：

1. **除了当毛刺为假时得到的连续环成立所产生的删数里，毛刺真推得为真的那个数不能删**（即图中的紫色配色的这个候选数，即 `r6c1(5)`）**以外，其他数字**（`r6c1(8)` 和 `r4c8(6)`）**均可删数**；
2. **毛刺为真时的所有弱链均可按环内弱链规则进行删数**（强行将前面的这个毛刺真的分支视为环里的强弱链关系，于是找出所有弱链对应其删数即可，即 `r7c4(18)`、`r8c3(4)` 和 `r9c2(5)` 可删，其中 `r7c4(18)` 是待定数组产生的额外删数）。

所以，这个图里所有删数正如最开始那个图里展示的那样。

### 为什么这么神奇？ <a href="#why-eliminations-are-so-many" id="why-eliminations-are-so-many"></a>

本身毛刺连续环就已经比较难了，而这个删数规则看起来更加让人摸不着头脑。这也太难理解了！我们来说一说为什么这个删数可以成立。

毛刺的本质是讨论其真假性，找出和原始结构里都可用于删数的部分，作为实际这个技巧所产生的删数。不过，毛刺还有一个性质是，毛刺和结构的成立状态（或者说成是链里的真假性）也是不同假的。也就是说，毛刺为假时，连续环必然成立；而当连续环成立时，因为强链会经过毛刺所在的区域，因此毛刺也根本不会存在（强链关系所在的区域只能有两处可为真的节点，他们俩必有一个满足，而毛刺的位置已经属于是“第三者插足”了）。

毛刺的分支最终回到了环的某个删数上，而删数自身应当和环是不同真的状态（环成立的话，删数就只能被砍掉；反之，如果删数的候选数一旦为真，则环也因为弱链的两端被删数填充所破坏，所以环也不会成立），所以我们就可以把这两个说法串起来看：

因为强弱链关系是可以逆向理解的，所以我们把强制链的这个分支倒过来看，即从删数位置 `r6c1(5)` 设为假，并回到毛刺 `r5c3(4)` 为假。注意这个思路，因为这个强制链分支是“毛刺真 ⇒ 删数真”的，所以倒过来看的时候应该取它的逆否命题，即“删数假 ⇒ 毛刺假”。倒过来有什么意义吗？有的。倒过来之后，借用前面说的这两点，整个环的思路就串起来了：

* `r6c1(5)` 为假 ⇒ 毛刺为假 ⇒ 连续环成立 ⇒ 连续环删数 ⇒ `r6c1(5)` 为假

或者简化为链的表述：

* `r6c1(5)` 为假 ⇒ 毛刺为假 ⇒ 连续环节点为真 ⇒ `r6c1(5)` 为假

这样就让结构周而复始地无限循环运作起来了。只是说，这里稍微不太像是链的地方在于，链需要强弱关系交替发生，换言之，节点的真假性就得交替出现。但这个例子里，`r6c1(5)` 为假时，推到毛刺的位置也是为假的，这看起来似乎违背了链的交替规则，但是实际没有。因为这个强制链分支内的每一个节点仍然是真假交替的，我们只是忽略了过程，只看到了头尾两端的结果而已。

那么，删数呢？为什么连毛刺作为强制链分支上的情况也可以用来删数？很显然是因为这个环的链路运作起来了，环上本身就具备所有弱链关系上可以对应的位置可以用作删数才有了这些地方。不过这里要注意一个比较容易忽略的地方：环上任意相邻两个节点的真假性一定是互斥的（一真一假）。因为这个规则，我们还可以用于找一些特殊删数。比如这个例子里，环节点自身和毛刺是强链关系，而环和毛刺一定是一真一假的，所以环自身可以用于删数。

> 我知道这里不好理解，所以我打算补充说一下这个内容。
>
> 根据之前结构节点的真假性讨论，环为真时可以删环里弱链的位置；而环为假时，毛刺为真。但是，毛刺也仅会影响毛刺所在的行列宫的地方，环的不成立的“源泉”只是因为毛刺这个位置为真，影响了所在的节点的填数状态，破坏了环的链路规则，但是其余的弱链关系并未遭到破坏（仍旧是客观成立的），所以仍然可以用于删数。故环里其他地方的删数可以得到保留。
>
> 所以，本质上我们还是只是在使用环的特性在找删数而已，并未用到什么高级或者超纲的知识点，只是因为环节点纳入链的思路过于新颖，所以导致它不太好懂。

## 例子 2 <a href="#example-2" id="example-2"></a>

我们再来看一个例子。

<figure><img src="/files/DNpDft4A9d1yynyogvkX" alt="" width="375"><figcaption><p>绽放环，另一个例子，毛刺假时的连续环</p></figcaption></figure>

如图所示。这是毛刺为假时的连续环。

<figure><img src="/files/2StDdO3tvNfBLYdp3D97" alt="" width="375"><figcaption><p>绽放环，另一个例子，毛刺真时的路径</p></figcaption></figure>

如图所示。这是毛刺为真时的强制链路径，它会回到连续环的其中一个删数 `r3c4(8)` 上。所以这个题的删数除了 `r3c4(8)` 不能删以外，都能删除；分支上也可以用于删数（不过这个题没有，因为 `r3c9` 只有两个候选数）。

## 例子 3 <a href="#example-3" id="example-3"></a>

这个例子我把毛刺真假的两个图合并一下，不过删数先不标，请各位自己理解一下，然后找出所有的删数。

<figure><img src="/files/Oj4kqtypxBv2oZYotzUD" alt="" width="375"><figcaption><p>例子 3，但是只有结构</p></figcaption></figure>

如图所示。看得出删数在哪里吗？是这些：

<figure><img src="/files/YYhQJlHO75Q2gHKUzJd9" alt="" width="375"><figcaption><p>例子 3，但是只有删数</p></figcaption></figure>

## 例子 4 <a href="#example-4" id="example-4"></a>

这个例子稍显复杂，不过也还是希望你自己看。

<figure><img src="/files/5AjQV7LCma32rgouN4u7" alt="" width="375"><figcaption><p>例子 4，毛刺为假时的连续环</p></figcaption></figure>

如图所示。这是毛刺为假时产生的连续环。

<figure><img src="/files/HY1OEJGudLStOQXErtV9" alt=""><figcaption><p>例子 4，两个毛刺分支</p></figcaption></figure>

如图所示。本题有两个毛刺，我们需要分别讨论，于是分别走到了两处不同的删数位置上。虽然这稍微有所变化（分支数量变多了一个），但之前的结论仍旧是有效的。因为这好比是把之前的一条链路上的逻辑改成了两个并行的分支，最终又同时汇合到一起。

## 总结 <a href="#conclusion" id="conclusion"></a>

可以看出，绽放环从本节内容里看得出来，虽然它还是动态环，但这次我们并未把这个技巧视为动态环的思路，而是用了毛刺连续环的视角将动态拆成了两个视角，避免了动态的介入，这样玩家也可以轻松了解删数的由来和推理过程，避免之前的非常臃肿的描述和证明删数可用性的原因解释。

所以，以后我们将绽放环视为毛刺连续环的场景会更多一些。

## 毛刺连续环的删数之间互相不同为真 <a href="#every-pair-of-eliminations-in-burred-loop-cannot-be-true" id="every-pair-of-eliminations-in-burred-loop-cannot-be-true"></a>

在讲完了前面的四个例子之后，我们来说一个推论。

<figure><img src="/files/DNpDft4A9d1yynyogvkX" alt="" width="375"><figcaption><p>刚才的例子 2</p></figcaption></figure>

如图所示。这是刚才的例子 2。

我想要说的这个推论是，**毛刺连续环里的所有可用删数之间是不同真的**。比如这个题里，如果 `r9c1(2)` 为真时，其他的删数（`r6c9(9)`、`r7c7(3)` 和 `r8c8(3)` 这三个）就都不能为真；同理，比如 `r7c7(3)` 为真的时，其他三个也都不能为真。

> 当然，我们当然知道这个题是有绽放环的，因此删数肯定是都给干掉了。但是，毛刺连续环和绽放环也并非是同一个东西。绽放环只是拿了毛刺连续环作为一个切入视角，而毛刺连续环也不全都非得是绽放环的逻辑（比如之前只能删一两个数那种就肯定不是绽放）。

我这里想说的是，当一旦有一个毛刺连续环出现时，如果我们强行将连续环视为成立的话，会引发图中的一些删数出现。而这些删数之间互相是不可以同为真的。这是为什么呢？

你随便假设一个进去就知道了。比如假设 `r9c1(2)` 为真，我们会破坏掉图中连续环的弱链关系 `2r9c4-2r9c7`，但是连续环里的其他强弱链关系完好无损。那么我们顺着去假设，我们必然会得到删数成立的情况。比如这个例子里 `r9c7(2)` 会为假，但 `r9c7(3)` 为真，于是 `r7c7(3)` 和 `r8c8(3)` 直接为假；继续沿着推理，我们还能得到 `r6c9(3)` 为真，所以 `r6c9(9)` 这个删数也为假。

也就是说，不论你从哪一个删数出发，假设其为真，虽然你会破坏掉临近的这个连续环的弱链关系，但是你换来的是其他删数必然为假的情况。

这个推论看起来好像没啥用。没事，请先记住它。这是一个伏笔。之后的思路会基于这个推论带来全新的思维。

哦对，这是个毛刺连续环，并非是真正的连续环。所以毛刺连续环强行成立所造成的删数并非是真实的删数。但是，为了方便描述，我们称呼这种删数为**预备删数**（Pre-elimination）。后续会使用这个说法。


# 牺牲

Sacrifice

绽放是一个非常不错的视角。但是问题也确实存在。什么问题呢？就是它太过于好用了，以至于平时的题目里很少会出现绽放的可用结构。那么，我们如果无法得到绽放的结论，我们还能怎么办呢？下面我们就进入到新的内容里来。

还记得前面让你记住的名字吗？探长。是的，这个思路也是他平时在做题时鼓捣出来的。


# 牺牲的基本推理

Reasoning of Sacrifice

## 先来看一个例子 <a href="#a-weird-example" id="a-weird-example"></a>

<figure><img src="/files/i76VRcraYwXt5dPIhKu7" alt="" width="375"><figcaption><p>牺牲例子，毛刺为假的环</p></figcaption></figure>

如图所示。我们发现，如果我们忽略 `r1c2(5)` 的话，此时会有这样一个连续环的结构。

这个结构看起来没什么问题。假设要用于删数呢？删数肯定是所有弱链上都可以删，我们可以找到比如 `r2c58(5)`、`r9c3(5)`、`r9c7(3)` 这些位置可以作为删数。前一节末尾我们把它称为预备删数，因为它没有实际的删数效果，仅仅是当这个连续环成立时才可以用于删数。

那么我们来看毛刺为真的情况。很遗憾的是，此时我们没办法找到毛刺为真而绽放的视角，即毛刺为真时推得某预备删数为真的状态。这可有些棘手了。我们不想放弃它，毕竟这个环看起来确实不错。

那么怎么办呢？没关系，我们还是继续我们的强制链分支的搜索。

<figure><img src="/files/lefA9dGnpZIXRucJKu92" alt="" width="375"><figcaption><p>牺牲例子，毛刺为真的分支</p></figcaption></figure>

如图所示。请将此图和上面的图进行对比理解。对比什么呢？删数位置。

前面那个图里，我们知道，毛刺连续环的预备删数包含 `r2c58(5)` 两处；而对于这个图里，一个是作为实际删数（的涂色），一个则作为的是……等会儿？`c8` 强链关系是什么情况？怎么绕过了 `r2c8(5)`？

是的，当毛刺为真时，我们可以忽略一部分预备删数。具体忽略哪一部分呢？**请将所有毛刺连续环里可用的预备删数均列举出来。我们需要瞄准其中一个位置，将其锁定作为实际的删数（因为毛刺为假时本身就可以删，所以我们这里只讨论毛刺为真时是否可以删它即可）；而其他不作为删数的预备删数，我们均可视为不存在**。这句话非常奇怪。我们稍后讲解这句话运作的本质原理。你先这么用就行。

我们忽略掉 `r2c8(5)` 后，`c8` 就会有强链关系，于是把剩下的 5 直接串起来形成强链关系即可。这样我们可以跟随这个强制链分支，直接得到 `r2c7(5)` 为真的结论。

因为 `r2c7(5)` 为真，所以此时可以排除掉 `r2c5(5)` 这个候选数。而它本身就是预备删数（换言之，是毛刺连续环在毛刺为假时本身就可以删除的数），所以综合来看，这个数均可删除，所以，我们可以认为，这个删数结论是成立的。故本题的结论是 `r2c5 <> 5`。

奇妙吧？我们将毛刺无法得到绽放效果时，将预备删数分为两组，一组作为实际删数（瞄准他们去删数），另一组直接忽略它的存在（跳过他们）、直接延伸强链关系的行为称为**牺牲**（Sacrifice），这种观察视角就被称为牺牲视角。

## 为什么牺牲是正确的逻辑？ <a href="#why-sacrifice-is-correct-logic" id="why-sacrifice-is-correct-logic"></a>

我知道你肯定理解不了它。这是这个思路理解起来最为困难的一点。我们仅去记结论也可以帮助我们找到很多可用结论；但是，我还是想跟各位讲解一下它的原理。不过，要想证明正确性，确实是一件困难的事情。我不强求各位能够真正理解这个的原理，因为它实在是过于复杂。但是，它可以给你带来非常有趣的证明思路。

### 逻辑学的蕴含式 <a href="#entailment-in-logic" id="entailment-in-logic"></a>

有一门学科叫逻辑学。在逻辑学这门学科里，我们会接触到诸如且、或、非的处理规则，将两个命题的真假性结合起来的推理过程，整合起来判别它整体的结果的真假性的东西。简要概括的话，这门学科是专门研究逻辑的真假性的。

在这门学科里，我们把推出的行为称为**蕴含**（Entailment，或 Logical Consequence），记作 $$P \to Q$$，其中的 $$P$$ 和 $$Q$$ 是两个命题（可用来判断对错的说辞）。

蕴含式也是可以判断真假性的。这一点非常诡异。它其实和我们日常生活中“如果……则……”的说辞非常像，但你非要说这句话到底是对还是错，确实不太好理解。不过你可以这么去想。我们期望这句话成立，自然就不能把“则……”的这一部分给反过来。

简单举个例子。如果我考到驾照了，我就带朋友去兜风。从客观层面来说，“考到驾照”是一个事情，“带朋友兜风”又是另外一个事情。看起来这两件事本身没有什么关系，所以我们可以穷举出四种组合情况，即对于这两个事情本身的既定发生还是没有发生排列出来四种情况：

* **都成立：考到驾照、带朋友兜风**；（成立）
* 前面成立：考到驾照，不带朋友兜风；（显然违背了初衷）
* **后面成立：没考到驾照，带朋友兜风**；（不知道）
* **都不成立：没考到驾照，也不带朋友兜风**。（不知道）

显然，考到驾照必须带朋友兜风是这句话满足的条件，而没有考到驾照的话，带不带朋友兜风就成了问题。因为句子之中并未说到没考到驾照会如何去做这个事情（语句只说了考到了之后该干嘛）。虽然看起来，没有驾照似乎就不能去兜风了，毕竟自己开不了车，但是去兜风我也没说能不能出去（不考驾照也可以出去兜风，请个代驾就行，带朋友兜风是我作为发起人，但不代表我非得以司机这个身份带朋友兜风），毕竟它是另一个平行世界里才会发生的事情，具体是否发生我们并不知晓。

在蕴含式里，我们把前半截为真、后半截为假的部分作为肯定不成立的情况（考到驾照，但是不去兜风）；而其他三种均认为是最终成立的，所以相当于是三种情况“或”起来。拿逻辑学的表达的话，假设 $$P$$ 表示考到驾照（前半截），而 $$Q$$ 表示去兜风（后半截），那么写起来就是这样的：

$$
P \to Q \equiv (P \land Q) \lor (\lnot P \land Q) \lor (\lnot P \land \lnot Q)
$$

逻辑学使用 $$\equiv$$ 来表示等价，而不是等号。但是你可以当成等号去理解。符号 $$\land$$ 表示“且”，$$\lor$$ 表示“或”，而 $$\lnot$$ 则表示“非”（也就是对原来的说辞的对错取个反）。

这个式子是可以化简的，但是我们这里并不需要化简，因为我们并不是用这个公式来参与一些复杂运算来证明牺牲的正确性。推算过程可参考 [Broken mention](broken://pages/Lla0FjZzcvg2FVlHmgE7#result-calculation) 的过程。

### 两层蕴含式 <a href="#higher-ordered-entailment" id="higher-ordered-entailment"></a>

需要理解牺牲，我们需要将蕴含式的逻辑升一级，变为两层的蕴含式。

我们要证明的是，**如果某预备删数** $$a$$ **为假（命题** $$A$$**）能得到另外的预备删数** $$b$$ **为假（命题** $$B$$**），则预备删数** $$b$$ **一定为假（命题** $$C$$**）**。这里请注意，这句话是在说毛刺为真的这个情况。毛刺为假时我们并不需要讨论，因为它本质就是一个连续环了，所以它的删数显而易见是成立的，为了确保删数可以最终成立，我们仅需要保证毛刺为真时也可以删除就行。

那么，这句话用蕴含式表达出来是这样的：

$$
(A \to B) \to C
$$

这个确实有些绕。我们要得到命题 $$C$$ 必须成立，就得要求前提 $$A \to B$$ 这一截整体的真假性是为真的（这个蕴含式必须是符合条件的状态）。

我们穷举一下四种关于命题 $$A$$ 和 $$B$$ 可以出现的情况：

* **都成立：预备删数** $$a$$ **为假、预备删数** $$b$$ **为假；**
* 前面成立：预备删数 $$a$$ 为假、预备删数 $$b$$ 为真；
* **后面成立：预备删数** $$a$$ **为真、预备删数** $$b$$ **为假；**
* **都不成立：预备删数** $$a$$ **为真、预备删数** $$b$$ **为真。**

刚才我们说到，蕴含式有三种可能成立的状态，即加粗的这三组。但是最后一种虽然在蕴含式里可以成立，但实际上并不可能。为什么呢？

还记得前一节内容的伏笔吗？预备删数互相是不可同为真的。也就是说，两个都是预备删数的情况下，根本就不可能出现第四种（都不成立的这种）情况。所以还剩下俩。

但是仔细观察一下。剩下的这两种情况，预备删数 $$b$$ 始终是为假的。也就是说，我们要满足 $$A \to B$$ 的一共有两种情况（第 1、3 种），而此时预备删数 $$b$$ 客观为假的缘故，所以完全可以得到 $$C$$ 结论成立，而根本就无需担心预备删数 $$a$$ 此时此刻的状态是真还是假。

哪一个是 $$a$$ 呢？`r2c8(5)` 这个节点。所以，它的真假性并不影响最终结论的形成。或者倒过来说的话，结论如果能形成，那么这个节点是真还是假都无所谓。这便是为什么我们可以跳过它的本质原因：因为它为假和为真都能删，所以完全可以忽略它的存在。

### 补充说明 <a href="#other-information-about-this-provement" id="other-information-about-this-provement"></a>

我相信你如果看完这一点，假设你看明白了，可能你还会存在一些别的问题。比如说，这个题里，`r2c8(5)` 和 `r2c5(5)` 不是在同一行么，犯得着这么证明吗？

并不是说这个证明仅仅是针对于这一个题的。之后我们会看到一些题目，牺牲视角会越来越复杂，并不是所有时候，预备删数互相都可以看得见。所以证明是通用的。

总之，这个证明使得我们可以忽略预备删数的存在。当我们发现一个预备删数可能会有结论时，我们不妨瞄准它，把其他的全部忽略（或者忽略必要的一些），然后形成一些特殊强链关系，最终往结论上靠，这是牺牲视角的核心用法。




---

[Next Page](/llms-full.txt/1)

