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

# 伪数组（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`。这便是同时可以删两种数字的伪数组的特殊状态。

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