# 伪数组（ESP）

在前面的内容里，我们知道跨区数组所需要满足的点一共有两点。第一点是格子数和用到的数字种类数量一致，第二点则是每个数只能最多出现一次。

而对于第二点，我们认为数组的定义范围下都是需要满足的特性。下面我们来看这个第二点不满足，却满足第一点的结构都应该怎么推理。

## 基本推理 <a href="#reasoning" id="reasoning"></a>

<figure><img src="/files/N2yMejC1tqJ4lTdZ9PP8" alt="" width="375"><figcaption><p>伪数组，第一个例子</p></figcaption></figure>

如图所示。可以看到，这个结构一共用了 5 个单元格：`r5c2359` 和 `r6c2`。数一下里面的数字种类，一共也有 5 个：1、4、5、7、8。

这似乎基本满足了跨区数组的规则。但是很遗憾的是，这个例子里，五种不同的数字里，数字 7 出现了特殊状态：它跨区了。这里的跨区肯定说的是 7 不再满足最多填入一个的规则。很显然，我们完全可以安排数字 7 同时填在 `r5c9` 和 `r6c2` 上，这照样不会有问题。因此，因为数字 7 的特殊性，整个结构就不再满足第二点特征，所以它不是一个跨区数组。

但是，先别着急因为不是跨区数组就后悔错过了删数。这个结构仍然有删数。虽然 7 不满足条件，但 1、4、5、8 剩下四种数字确实是最多只能填一个的。由于题目里其他数字都只能最多填一个，所以结构里的数字 7 必须至少填一个。

有人问为什么。其实很简单，因为数字 1、4、5、8 只能最多填一次，所以四个数算上也最多只能占四个单元格。整个结构用了 5 个单元格，还剩下一个必须填的是 7。要不然你就填俩 7 进去，然后让 1、4、5、8 的其中一个数填不了也行，毕竟说的是 1、4、5、8 是*最多*一次。

总而言之，数字 7 不填结构放不满 5 个单元格，所以会有矛盾。所以 7 必须填至少一个。于是，结论就有了。我们按之前学到的类似 XYZ-Wing、WXYZ-Wing 那样的删数逻辑来看它就行。找所有 7 都“看”得到的地方。

显然，本题里只有 `r5c1` 满足条件，因此结论就是 `r5c1 <> 7`。

我们把这个结构称为**伪数组**（Extended Subset Principle，简称 ESP），象征着它差点就满足跨区数组的规则了，但因为有一个“瑕疵”导致它无法按跨区数组的模式进行删数，但处于一种不是跨区数组却仍旧有删数的特殊状态。伪数组的英文名如果直译的话，是翻译成“数组原理拓展”，即拓展了数组的推理逻辑，衍生出来的技巧。

下面我们再来看一个例子。这个例子是 4 个单元格。

<figure><img src="/files/XDgnt4nI5MNhcvFm6kau" alt="" width="375"><figcaption><p>伪数组，第二个例子</p></figcaption></figure>

如图所示。这个例子就自己看了，逻辑完全和前面的一样。

## 在行和列上的伪数组 <a href="#extended-subset-principle-on-lines" id="extended-subset-principle-on-lines"></a>

下面我们来看一下，伪数组在行和列上的情况。

<figure><img src="/files/eXQI9QvRyUwD2JaLkhrP" alt="" width="375"><figcaption><p>伪数组，第三个例子</p></figcaption></figure>

如图所示。数一下数字的种类数：1、2、3、4、6 一共有五种，再数数单元格数量：`r1c156, r67c5` 也是五个。非常 nice，它和之前的例子完全一样，只是把宫给干掉了，改成了行+列的组合。所以它满足跨区数组的第一点。

第二点呢？似乎只有数字 3 是可以填两次的，其他的最多就能填一次。那么我们也试试用伪数组的思路去理解，看看可不可以。

显然，数字 3 如果不出现的话，1、2、4、6 是不足以填到五个单元格里的，因为他们每一个数都最多只能填一次，所以伪数组的逻辑 OK。删数呢？删数也 OK，这个例子里的删数是 `r2c5 <> 3` 也是存在的。所以，这也是伪数组，只是把结构调了下位置。

## 多种数字可重复的伪数组 <a href="#complex-analysis-on-extended-subset-principle" id="complex-analysis-on-extended-subset-principle"></a>

前面我们介绍的都还算比较简单。下面我们来看分析起来稍微复杂一些的伪数组。

<figure><img src="/files/sJOruzMXA6FHkFCM78p7" alt="" width="375"><figcaption><p>分析稍微复杂一点的伪数组，第一个例子</p></figcaption></figure>

如图所示。仔细数一下单元格数和数字种类数就可以发现，这个例子直接就不相等了。数字种类数有 4、5、7、8 共四种，而单元格一共有 `r1c15, r2c179` 共五个单元格。

这连第一点都不满足了，这还咋推理啊。别着急嘛。我们来看看里面数字的跨区状态。显然，数字 4 和 5 这两种数字是最多只能有一个的，那么问题只出在数字 7 和 8 上：数字 7 和 8 他们最多能往里面填两个进去。

因为我们要填到 5 个单元格里去，强迫 4 和 5 都出现，那也还剩下三个空格未填。简单使用抽屉原理就知道，不论数字 7 填几次，数字 8 肯定都会至少有一次填入的机会的。因为三个单元格要填两种不同的数字，而数字 7 和 8 最多也就能填俩，而就算最多是两个，那保持三个单元格都能正常填数，势必数字 8 会出现至少一次。当然，数字 7 也是至少出现一次的。

所以，删数呢？因为数字 8 至少有一个，所以删数自然就是看所有的 8 都可以看得到的地方。于是，`{r1c8, r2c6} <> 8` 的结论就有了。这个题有关于数字 7 的结论吗？很遗憾的是，因为 7 比较特殊，它出现的位置比较多，导致它没有合理的删数，所以这个题只有关于 8 的结论。

那是否存在两种数都能删的情况呢？显然这个答案肯定是“是”。下面我们就来看一个这样的例子。

<figure><img src="/files/SKGx5XAjZ7hl5FRACKqn" alt="" width="375"><figcaption><p>分析稍微复杂一点的伪数组，第二个例子</p></figcaption></figure>

如图所示。这个例子里一共用了 6 个单元格：`r456c9, r589c8`，数字种类数则是 1、3、4、7、8 共五种数字。显然，3、4、7 是不能跨区的，所以这三个数字最多只能出现一次。

而为了确保单元格放满全部的数字，所以极限一点，把 3、4、7 都填进去，也还剩下三个单元格要填数。所以，1 和 8 势必都会出现（至少一次）。不管是 1 也好，还是 8 也罢，随便哪个数字出现两次都无关紧要，所以，显然数字 1 和 8 肯定是可以用于删数的。

然后我们再来看删数，神奇的一点发生了。数字 1 似乎有删数，因为结构里用的四个 1 都可以看到的地方是 `r4c8` 和 `r8c9` 两处单元格；而数字 8 也有删数，因为结构用到的五个 8 都可以看到 `r4c8`。所以，这个题的结论就是 `r4c8 <> 18, r8c9 <> 1`。这便是同时可以删两种数字的伪数组的特殊状态。

至此，我们就把伪数组的内容介绍完了。


---

# 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/full-marking-techniques/12-extended-subset-principle.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.
