> 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/partial-marking-technique/03-direct-subset/01-direct-hidden-subset.md).

# 直观隐性数组

## 隐性数对（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)`
