# 三顺一逆现象

在进行后续的内容之前，我们需要将之前的内容进一步推广。

本篇内容不讲任何实际的例子，是为了下一讲的内容所作的铺垫。

## 隐藏起来的奇数长度的环 <a href="#the-hidden-oddagon" id="the-hidden-oddagon"></a>

<figure><img src="https://3269563042-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBwg2o9WwhosLFTuqyR3w%2Fuploads%2FWmdo9V2gic9fYC0fnjv8%2Fimage.png?alt=media&#x26;token=30ab3847-a6ed-4a26-b545-0c0df0bf54bd" alt="" width="375"><figcaption><p>死环（结构）</p></figcaption></figure>

如图所示，这个是一个标准的死环。为了后续解释内容起来比较简单，我们不妨用长度 5 的举例即可，其他的均可相似地进行推广。

显然，这是一个无解的局面。因为奇数长度的环被串起来后，总会有两个同在一个区域里的单元格出现重复填数的情况，所以它肯定是不可能成立的。

我们尝试在结构上追加若干个单元格，然后使得这些单元格可以形成和唯一环那样看起来毫无违和感的结构：

<figure><img src="https://3269563042-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBwg2o9WwhosLFTuqyR3w%2Fuploads%2FfPf8pG2Pkf4TQpzabdRl%2Fimage.png?alt=media&#x26;token=0f8911a5-9d23-4b37-866c-f1670c55a6f1" alt="" width="375"><figcaption><p>藏起来的死环</p></figcaption></figure>

如图所示。我们增加了 `r1c47` 和 `r5c7` 三个单元格，使得结构的所有单元格完全封闭起来。当然，因为改变了单元格的串联关系，所以连线就需要改动一下。不过好在这个结构看起来比较简单，改起来并不费事。

<figure><img src="https://3269563042-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBwg2o9WwhosLFTuqyR3w%2Fuploads%2FMES8MO4HBViU5MwmTYan%2Fimage.png?alt=media&#x26;token=3cce6d9f-beda-4a72-92d4-b81da9b8c4db" alt="" width="375"><figcaption><p>死环结构的环路</p></figcaption></figure>

如图所示。这样我们就构成了一个死环结构，但这个死环比较特殊。我们继续分析一下。

## 偶数长度的死环？ <a href="#an-oddagon-with-an-even-length" id="an-oddagon-with-an-even-length"></a>

我们添加的三个单元格也有一定的讲究，它并非随意添加。我们将原有的五个单元格外加了三个单元格，但这三个单元格和原有的五个单元格凑起来是 8 个单元格。

可能你会问，这不是废话么？其实不然。回忆一下，8 是偶数，偶数长度的环是不会造成矛盾的，因为交替填充数字的时候并不会造成矛盾。可这个结构显然违背了这一点。

单独看这个结构似乎是“人畜无害”，但按照我们最初使用死环的思路推广得来的思维，我们不难发现，它的本质并未发生任何改变——里面仍然会有一个死环。而且不只是这样，这个结构增加了三个单元格并非白添加的，添加的单元格也可以纳入死环的计算之中。仔细数数，这个结构里其实藏了不止原来那一个死环，而是 8 个：

* `r1c4 -> r1c7 -> r5c7 -> r5c5 -> r2c5 -> r1c4`
* `r1c4 -> r1c7 -> r2c8 -> r4c8 -> r4c4 -> r1c4`
* `r1c4 -> r1c7 -> r5c7 -> r4c8 -> r4c4 -> r1c4`
* `r1c4 -> r1c7 -> r5c7 -> r5c5 -> r4c4 -> r1c4`
* `r1c4 -> r2c5 -> r2c8 -> r4c8 -> r4c4 -> r1c4`
* `r1c7 -> r2c8 -> r2c5 -> r5c5 -> r5c7 -> r1c7`
* `r2c5 -> r2c8 -> r4c8 -> r4c4 -> r5c5 -> r2c5`
* `r2c5 -> r2c8 -> r4c8 -> r5c7 -> r5c5 -> r2c5`

所以，看似是偶数长度，但实际上它仍然是奇数长度的环，而且不是一个。

## 三顺一逆现象 <a href="#rebellious-block-phenomenon" id="rebellious-block-phenomenon"></a>

可能你已经注意到了。虽然是偶数长度的环，但它只是表象。藏起来的这 8 个死环才是它造成矛盾的本质。虽然我们可以将这个偶数长度的环按照前面给的配图的方式串起来，但我们真往上进行数字 1 和 2 的交替填写的时候仍然会发现问题。

<figure><img src="https://3269563042-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBwg2o9WwhosLFTuqyR3w%2Fuploads%2FaafxtJwZSjpVkh2g4IXw%2Fimage.png?alt=media&#x26;token=bff7ed82-4889-417d-b050-050ee7d18a9e" alt="" width="375"><figcaption><p>交替填写仍然有矛盾</p></figcaption></figure>

如图所示。我们按照环路的次序交替填写 1 和 2（这里我们用字母代替）。不难发现，虽然我们绕过了行和列上不冲突填数的规则，但宫在环路上并未得到良好的“检查”，所以按环路填写之后，四个宫里的单元格却是相同的填数。这仍然是不满足数独的基础填数规则的。

你可能会觉得，“这个现象为什么在之前的唯一环里没有出现，但在这里却出现了？我知道这里面藏了几个死环，但死环的存在好像并不能严格决定结构出现这种特殊矛盾”。

其本质原因在于，这个结构有一个宫的单元格摆放是特殊的。对没错，`b6`。我们可以发现，这个结构用到的 4 个宫里，只有 `b6` 的两个单元格的“倾斜方向”是不同的——`b235` 的两个单元格都是左上选择一个格，右下选择一个格；而 `b6` 则是右上方选的一个格，左下方选了另一个格。

`b6` 摆放的不同造成了结构出现客观矛盾的情况。因为这个宫的单元格的选择打乱了串联成环路的选择。如果原本是 `r4c7` 和 `r5c8` 的摆放的话，那么前后连接的单元格自然就是“对称”的，那么连到这两个单元格的时机就一定是一样的。可问题是 `r4c7` 成了 `r4c8`，所在的列发生了变化后，原本走 `c7` 进入连接的 `r4c7` 不得不用 `c8` 进入连接到 `r4c8` 里来。当结构不再“对称”之后，切入的时机发生了微妙的变化；而其他的单元格的“倾斜方向”均没有变化，这便会导致 `b6` 的连接链路前后用到的单元格数量不平衡，自然就会出现客观的矛盾。

> 这里说的“平衡”和“对称”指的是结构的单元格摆放。结构如果四个宫里的单元格全朝着一个方向倾斜，那结构就是中心对称的，那你随便从哪一个单元格起步去找环那都是相似的结果，换言之就是说，你只需要讨论一个情况就行，其他七个位置都不需要考虑；而这个 `b6` 破坏了这个对称性，所以环路不再对称，自然就打破了前后连接单元格数量的平衡性。也就是说，原来前后肯定是一样多的单元格数量，现在打破了平衡后就不一样了；因为总单元格数是固定的，所以连接的单元格只会有轻微变动，就好像式子从 4 + 4 变成了 5 + 3 这样的效果。
>
> 如果你仍然不能理解，你也可以试着不用环路去看，而是直接上手假设 8 个单元格填入 1 和 2。个人建议你从 `b2` 开始假设会更容易知道矛盾的本质——因为 `b6` 剩下的两个空格的倾斜方向不同，所以它会同时看到两个不同的数字，于是就会造成无解。

我们把这种四个宫里其中有一个宫摆放不一样的特殊现象称为**三顺一逆现象**（Rebellious Block Phenomenon）。这种现象会发生在死环的内容里。下一节的内容我们会给各位看看它在实际题目之中的使用。
