> For the complete documentation index, see [llms.txt](https://sudoku.kazusa.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sudoku.kazusa.tech/full-marking-techniques/01-normal-fish/05-direct-view-of-fish-and-law-of-complement-of-fish.md).

# 鱼的直观和互补性

这一部分的内容不打算讲解技巧，主要还是理论知识。

可能你在学习鱼的时候发现它和数组其实是有一定的关联的。哪怕你看不出具体的关系，但是起码你会觉得这两个东西有一些不好描述清楚的细节是差不多的。比如说，鱼似乎在讲解的时候也就到 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 的提示数或填入数。
