# 秩的修正方式

之前我们学到了两个内容：自增和自减现象，以及 XSudo 软件对结构的秩的定义，还简单提及了一些结构的特殊属性，比如最小结构等。

从结构的定义上来说，秩的定义已经足够清晰和合理，但在一些复杂的场景而言，秩的结果不足以表示出一些结构的特征，例如虽然结构的秩为 1，但删数仍然能像环类结构一样用零秩的思维去删，典型的技巧就是之前介绍过的胖姨环。

所以，我们特此追加一篇和 XSudo 定义不同的、更符合人脑思维的方式去对秩理论的计算进行轻微修改。

还记得我之前留下的伏笔吗？我们认为 XSudo 对秩的计算会更加暴力一些，所以不符合人的思维，因此小舟之前使用了自增和自减现象来把结构单独提出来看，就可以修正秩的结果了。下面我们将介绍的是其修正的思路。

{% hint style="warning" %}
本文章是基于秩理论的推广思路，所以思路比较主观。你可以用于参考，但不必深究其细节；或者自己考虑一下你自己对秩理论的理解。
{% endhint %}

## 基础结构查表 <a href="#tabling-on-well-known-patterns" id="tabling-on-well-known-patterns"></a>

首先，对于基础结构而言，我们并不需要单独去进行推导。当我们知道结构可以适用这个技巧的推理手段的时候，那么我们就可以直接将它的秩“脱口而出”而不是去细看。

常见的结构如下：

| 技巧       | 秩    |
| -------- | ---- |
| 数组       | 0    |
| 普通鱼      | 0    |
| 鳍鱼       | 鱼鳍数量 |
| XY-Wing  | 1    |
| W-Wing   | 1    |
| XYZ-Wing | 2    |
| 欠一数组     | 0    |
| 对交空矩形    | 0    |
| 融合待定数组   | 0    |
| 普通链      | 1    |
| 环        | 0    |
| 绽放环      | 0    |
| 网        | 0    |
| 复数鱼      | 0    |

这张表记住了确实会对你修正秩的计算时有一定的帮助，避免你反复去手动推算浪费不必要的运算时间。

另外，这张表有一些技巧并未列出，除了唯一矩形这些无法使用秩理论的技巧以外，还有一些技巧，例如烟花数组、守护者什么的。他们按理说都有秩的定义，但要么这些技巧无法用秩理论表达（唯一矩形这种），要么不常见用于结构的推算之中（WXYZ-Wing 这种），要么就是下面要说的，需要修正的技巧结构（烟花数组、胖姨环这种）。

## 修正秩 <a href="#get-fixed-rank" id="get-fixed-rank"></a>

所谓秩的修正，指的是将结构的秩的推算进行模糊处理，将其中一部分当成结构，单独从结构里脱离出来。他们可能存在稳定的填充次数，所以讨论的时候先脱离，算出其填充次数后再放回结构里，进而将大结构分治处理为若干小结构的形式。

还是拿之前学到的结构来举例。

### 自增修正 <a href="#auto-increment" id="auto-increment"></a>

<figure><img src="/files/ihKYhcruzfnYAMztg72Z" alt="" width="375"><figcaption><p>烟花数组自增修正</p></figcaption></figure>

如图所示。按照 XSudo 的规定，我们需要对每一个删数进行分析。拆开后发现结构的每一个强弱区域都会被用到，所以它是最小结构。但因为通过穷举知道，实际所有的最小子结构里都只能填 5 个数字进去，但有 6 个弱区域，所以秩是按 1 处理的，故这个结构是秩为 1 的。

这种定义在设计上并不理想，因为我们通过细致推算可以发现，它每一个弱区域都是零秩的，那结构如果是零秩的似乎更合理一些。

修正秩的方式是，将结构的自增自减分析纳入结构里。例如此结构里，有 1、2、3 三种数字参与烟花数组的分析，而实际上 6 个强区域交于 `r1c9` 里，实际上整个 6 个强区域本身就只能填 5 个数，所以属于自增现象。

按照这么算的话，因为你本质只能填入 5 个数字进去，所以所有 6 个弱区域按理说可能会覆盖不到，这才会造成秩为 1，但是 `r1c9` 比较特殊。这个位置在自增现象里体现的效果是它必须会被占位。换言之，之前在分析的时候我们发现，`r1c9` 必须填 1、2、3 的其一，所以它为真后会造成的现象是，同时让两个强区域占位的同时，也会同时让 `1n9` 和 `b3` 某个数的弱区域占位，即一连占用 2 个强区域和 2 个弱区域。

其他的数字在分配的时候，每个数都只会恰好使用一个强区域和一个弱区域（精确覆盖）。所以强区域占用的情况是：

* `r1c1` 占一个数，占一个强区域和一个弱区域；
* `r1c78` 占一个数，占一个强区域和一个弱区域；
* `r1c9` 占一个数，同时占了两个强区域和两个弱区域；
* `r23c9` 占一个数，占一个强区域和一个弱区域；
* `r9c9` 占一个数，占一个强区域和一个弱区域。

即强区域使用情况是 1 + 1 + 1 + 1 + 2 = 6，弱区域也是 1 + 1 + 1 + 1 + 2 = 6，不存在其他的排列。

这两个式子代表的是一个推算的方式——把问题直接简化为“本质上实际只能有多少个强弱区域的占位”。虽然我们只能填 5 个数，但强弱区域全都可以被用掉，所以强弱区域数量在所有填数状态下都是一样的，故结构直接用 6 - 6 = 0 就可以了。

### 自减修正 <a href="#auto-decrement" id="auto-decrement"></a>

再比如这个题。

<figure><img src="/files/ZDGwVRXN89Yy4ajJZHsR" alt="" width="375"><figcaption><p>胖姨环自减修正</p></figcaption></figure>

左下角数字 1 是自减现象。它出现了 4 个弱区域。根据 XSudo 的算法，因为实际上讨论的每一个删数对应的最小子结构都有 7 个弱区域，所以是使用 7 - 6 = 1 得到秩为 1 的结果的。

我们可以试着修正一下。将下面四个弱区域看成一个整体。因为它在实际的填数环节里虽然内部无法确定 1 的实际填数位置（占用其中哪些弱区域），但你始终只会往其中填入最多两次 1。对于此题而言，这还不是“最多两次 1”，而是“恰好两次 1”。所以，任意你怎么安排填入 1 的位置，这 4 个弱区域也只会有其中两个会被占用。所以，强区域数量 6 个都会被占用，但弱区域虽然有 8 个，但实际上也只会用到 6 个。所以，统计其强弱区域的次数时，应按 6 来计算。故这个结构的秩应该被修正为 6 - 6 = 0，即仍然是零秩的。

看到了吗？修正秩的方式是去泛化本身的强弱区域的出现，而不针对于具体哪个/些的出现情况来进行单独讨论，而是整体分析。只要我们确保整个结构的强弱区域的次数会有多少个被占位，然后相减即可。

## 修正造成多重秩的情况 <a href="#fix-rank-may-cause-multirank" id="fix-rank-may-cause-multirank"></a>

对于有些题而言，它既不存在自增也不存在自减现象，当使用此修正方式对结构的秩进行修正后，我们可能会得到多重秩。

<figure><img src="/files/zkRzRmWLpNF66xZfhPRv" alt="" width="375"><figcaption><p>修正成多重秩的例子</p></figcaption></figure>

如图所示。这个也是之前出现过的一个题目。这个题里一共有 6 个弱区域和 5 个强区域构成。在查验删数的时候，我们发现结构里有一个弱三元组 `r5c5`，它的占位与否可能会影响强弱区域数量的计算。标准意义上来看，它需要检查每一个删数的最小子结构，然后确保它的出现的弱区域数量都是多少个。对于此题，每一个删数都会全部用完所有的弱区域和强区域，因此其秩一定为 6 - 5 = 1。

不过具体讨论就省略了，因为这里也不是讲讨论过程的，而且这个题之前也讨论过一次了。不过，为了方便你稍后理解我想说的东西，我还是把它的全部填法展示一遍。

<figure><img src="/files/9P2akCcxQHOr3nKcFgfP" alt=""><figcaption><p>结构所有填的情况</p></figcaption></figure>

如图所示。可以看到，这个结构有些时候（例如第一个图）会覆盖全部 6 个弱区域；但也有时候（例如最后一个图）只会覆盖到 5 个弱区域。

从效果上讲，本结构原本 6 个弱区域都会被用到（讨论每一个删数的最小子结构时，每一个删数造成的最小子结构将会全部用完 6 个弱区域和 5 个强区域），因此结构的秩为 1；但如果修正后来看的话，我们只确定出有多少强区域和弱区域参与覆盖的话，这会造成结构出现双重秩 0 和 1。

## 冲突和解决方案 <a href="#conflict-with-traditional-rank-theory-and-its-solution" id="conflict-with-traditional-rank-theory-and-its-solution"></a>

### 出现冲突的本质原因 <a href="#factor-causing-this-conflict" id="factor-causing-this-conflict"></a>

出现多重秩现象的本质原因在于我们只是去看强弱区域的使用（或者说覆盖）情况了。这确实会出现一些分析上和之前描述上的不同。

这造成了理解的冲突和和之前秩理论分析不兼容的推算过程。按理说教程不应出现比较主观的说辞，所以修正造成的这种不一致的解决方案我们就交给你自己去看待了。

### 小舟对秩的修正方案 <a href="#one-kind-of-solution-to-fix-rank" id="one-kind-of-solution-to-fix-rank"></a>

小舟本人的做法是这样的：

计算结构的强弱区域，并且挖掘结构里出现的自增自减现象的子结构。通过将结构分块处理后确定它最少的可填次数和最多的可填次数。其中：

* 最少可填次数（假设为 $$n\_t$$）：往强区域里填充数字，找出最少填入几次可以让全部强区域都覆盖有数字（只要能造成覆盖就行，不论填数是否会造成明显的冲突）；
* 最多可填次数（假设为 $$n\_l$$）：往弱区域里填充数字，找出最多填入几次可以让全部弱区域都覆盖有数字（只要能造成覆盖就行，不论填数是否会造成明显的冲突）。

然后我们定义：

* 当假设强区域时，实际结构填的次数 $$n$$ 比最少可填次数要多（即 $$n > n\_t$$）的时候，我们称这种现象叫强区域自增现象；
* 当假设弱区域时，实际结构填的次数 $$n$$ 比最多可填次数要少（即 $$n < n\_l$$）的时候，我们称这种现象叫弱区域自减现象。

此时我们需要拿实际上填的次数 $$n$$ 对这个子结构进行修正（修正后分别假设为 $$n'\_t$$ 和 $$n'\_l$$）。其最终完整的结构的填写次数应等于我们拿到的每一个分块里得到的实际填数的总和。

然后，整个结构修正后的秩 $$R'$$ 等于最多和最少可填次数（经修正过的结果）的差值，即

$$
R' = n'\_l - n'\_t
$$

因为修正后的最多和最少填充次数可以反映强弱区域覆盖的实际填充次数，所以它算出的秩的结果相对 XSudo 软件分析出来的结果

$$
R = n\_L - n\_T
$$

而言要更符合人脑思路一些。

虽然光看字母使用好像也差不多，但是修正与否确实非常关键；XSudo 对修正并未过多作出处理，而是采用了更复杂的穷举。这便是小舟给出的完整的计算秩的方案。

## 自增自减帖子简要说明 <a href="#topic-about-auto-increment-decrement" id="topic-about-auto-increment-decrement"></a>

下面给出小舟对自增自减现象的子结构的总结帖子：

{% embed url="<https://tieba.baidu.com/p/8489023513>" %}

这个帖子给出了它对自增自减现象的简要描述，以及一些常见的、需要自增自减修正的结构的总结。

> 另外需要特殊说明的是，小舟将弱区域自减现象称为“弱区域自噬”或者叫“link 自噬”。这个说法是想贴合鱼里自噬现象，可提供删数效果。不过本教程并未采用这个说法。未采用的原因是单纯因为它和自噬并不一样，它只在一些场景下和自噬现象体现的删数效果一致，但这样会造成理解上的困难和可能的混淆，所以本教程单独采用了一个和自增说辞对称的名称“自减”表示其现象。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sudoku.kazusa.tech/rank-theory/10-rank-fixing/03-solution-to-rank-fixing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
