# 直观隐性数组

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


---

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