> 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/direct-technique/01-crosshatching.md).

# 排除

**排除**（Crosshatching），也叫**排除法**，是数独里最常见的一种技巧。按照游戏具备的行、列、宫三大要素，排除也会分为这样三个类型。

> 排除早期也被称为**摒（bìng）除**，一般认为是台湾地区引入数独的时候传入大陆的说法。后续还有一些技巧也会沿用台湾的叫法称呼，到时候也会说明一下。

## 宫排除（Crosshatching in Block） <a href="#crosshatching-in-block" id="crosshatching-in-block"></a>

我们把顺序调整一下，先来说说**宫排除**（Crosshatching in Block）。

<figure><img src="/files/5bPpqUbx7lQvYYPmRVL0" alt="" width="375"><figcaption><p>宫排除</p></figcaption></figure>

如图所示，我们把目光聚焦到第 7 宫里。

> 哦对，第 7 宫是左下角这个宫。宫的编号按照从左到右、从上到下的次序依次编号。最上层的三个宫分别为第 1、2、3 宫，中间层的为第 4、5、6 宫，而最下层的则是第 7、8、9 宫。左下角编号是 7，所以就叫第 7 宫。
>
> 另外，按照本教程的“尿性”，我们后续会一直使用 RCB 表达。因为 `r` 表示行，`c` 表示列，而 `b` 表示宫，因此 `b7` 可直接用于表示第 7 宫。后续我们也会使用这种方式来描述一些行、列、宫的具体编号。

我们需要遵守的数独规则里，其中一点是要求每一个行、列、宫都要有完整的一套 1 - 9。遵循这个规则我们深思一下。一个行、列、宫都有恰好 9 个格子，而完整的一套数字 1 - 9 又刚好是 9 种不同的数。那么我们安排每一个数出现一个放进去的话，就刚好用完了全部的 9 个单元格。因此，一旦中间出现重复的数字，那么那个重复的数字就会占用两个单元格及以上的名额，导致余下的 8 种数字无法再合理地安排进去了。换言之，必然会有一个数字最后无法填入其中，即保证不了完整一套 1 - 9 了。所以，完整的一套 1 - 9 暗含了一个意思：所有的数字不允许出现重复项。

按照这个说法，显然 `b7` 也不例外。我们发现，由于 `r2c1` 和 `r8c9` 都是 1 后，他们各自的所在行和列上都不允许再出现第二个 1 了，否则就违反了“不允许有重复项”的规则。正是因为此规则，图中打叉的位置都不能是 1。而纵观整个 `b7`，就只剩下唯一一处可以填 1 的位置。因为 `b7` 没有 1，那么 1 必须出现在其中，因此我们只能把 1 安排在唯一的那一处位置上。因此我们就得到了 `r9c3 = 1`。

由于这个技巧的推理结论下在 `b7` 之中，所以我们把这个推理过程（我们所谓的“技巧”）称为宫排除，即通过排除得到宫内结论的一种手段。

## 行排除（Crosshatching in Row） <a href="#crosshatching-in-row" id="crosshatching-in-row"></a>

<figure><img src="/files/T6IDMAD1LcTbAZRrf3bp" alt="" width="375"><figcaption><p>行排除</p></figcaption></figure>

如图所示，图中除了黑色的提示数外，我们还可以通过才学到的宫排除完整一些蓝色位置的填数。我们把这些蓝色的数字称为**填入数**（Modifiable）。填入数有些时候也可以参与推理过程，并不是说填上之后就放在那里“吃灰”了。当然，填入数最后会因为我们的推理顺畅而变得越来越多，因此部分填入数确实不一定会发挥它的推理的作用，所以这取决于你自己的灵活变通了。

> 在早期的教程里，填入数还被称为**确定值**。不过本教程暂时弃用这种说法，因为不够直观。

此时我们观察第 3 行（也就是 `r3`）。我们可以明显观察到，第 3 行需要满足一套完整的 1 - 9 的话，只缺少 5 和 9 尚未填入了。

而只关注于 5 的话，我们可以明显发现，`r9c2` 是 5。因为同列不能填入重复的 5，因此身处同一列的 `r3c2` 自然就不能是 5 了。那么，由于 `r3` 必须拥有一个 5 的填入，因此填入 5 的机会只能给到 `r3c8`。因此，图中的结论就是 `r3c8 = 5`。

我们把这个技巧称为**行排除**（Crosshatching in Row），因为他的填数位置是在 `r3` 之中的。

## 列排除（Crosshatching in Column） <a href="#crosshatching-in-column" id="crosshatching-in-column"></a>

下面我们来说说最后一种类型的排除。

<figure><img src="/files/gcL9dm3qKDq4WAaoDQvp" alt="" width="375"><figcaption></figcaption></figure>

如图所示，这一次我们把目光聚焦到第 8 列（即 `c8`）。

我们发现，数字 7 没有出现在 `c8` 里，因此 7 必须填进去一个。随后我们发现，`r1c2` 已经是 7，所以同一行不能填入 7，所以与之同一行的 `r1c8` 自然就不能是 7 了。不过，还剩下三处打叉的位置，这又是怎么排除的呢？

其实这里我们只需要一个数就可以参与排除了。注意到 `r4c7`。由于数独规则里，同一个行、列、宫里都不能有重复的数字。我们前面用到的只有行和列，这里我们要用到的是宫的排除因素。因为同一个宫也不允许有重复的数字，因此 7 出现在 `b6` 之中，也就意味着 `b6` 的别处都不能填入 7。所以，三处打叉的位置都和这个单元格同宫，因此他们都不能是 7。

这么一说，这个 7 的位置就比较明了了。`c8` 里此时仅剩下唯一一处填入 7 的位置：`r2c8`。因此，它必须是 7。

我们把这个技巧称为**列排除**（Crosshatching in Column），因为结论下在 `c8`。

> 另外，行排除和列排除在不那么需要强调行还是列的时候，也可以合并称为**行列排除**（Crosshatching in Line）。

## 问题答疑 <a href="#q-and-a" id="q-and-a"></a>

下面列举一些常见的、关于排除技巧的问题。这可能对你初学排除技巧有所帮助。

### 问题 1：在找行列排除时，宫内别处似乎也可以填它，为啥不能是它填？ <a href="#question-1" id="question-1"></a>

为了更加详细地解释这个问题，我们使用前面行排除的题目给大家解释一下问题问的是什么。这个问题也是经常有朋友询问我的一个问题。

<figure><img src="/files/T6IDMAD1LcTbAZRrf3bp" alt="" width="375"><figcaption><p>还是那个行排除</p></figcaption></figure>

如图所示。这就是刚才的那个行排除的题。有些朋友会问，我们使用了行排除的推演逻辑，用到的是下方 `r9c2` 处的 5。这个 5 虽然可以得到 `r3c8 = 5` 的推演结论，但是凭什么 `r1c8` 就不能是 5 了呢？

我个人觉得，问出这种问题的朋友具有发散的思维，这是好事。但这里我们并未对 `r1c8` 是否是 5 作出任何的推断。相反，数独的三大约束条件：行、列、宫的重要性是等同的。我们知道宫的逻辑后，就很容易思维转不过来，而在看行列排除时，误用或错用宫的逻辑去思考它，导致推断逻辑的混淆。显然，这里 `r1c8` 是否是 5 并不重要。我们观察的点始终都在 `r3` 上。

而从另一个角度来说，有些朋友更希望使用反证法的思维去推演矛盾，进而得到假设错误的思路。套用在这里也是可行的。比如我们反过来思考这个地方。如果我们让 `r1c8 = 5`，那么因为 `r3c8` 和 `r1c8` 同宫（也可以理解为同列），因此 `r3c8` 就不能填 5 了。而它不能是 5，同行还剩下唯一一处空格 `r3c2` 也会被最下面 `r9c2` 的 5 给排除掉，这导致了一个问题：`r3` 将不存在任何空格填 5。而它必须填有一个 5 以满足一套完整 1 - 9 的规则。所以这不就矛盾了嘛。因为假设的是 `r1c8 = 5`，所以假设不成立，故 `r1c8` 它不能是 5。

这种理解也没毛病，但这稍微绕了一些。我仍然推荐用正向的思路去理解这个问题。

总之，数独是一个严格的推理游戏，一旦有一个环节有错误的推断，那么后面必然就会产生矛盾。

### 问题 2：为什么不惜打乱顺序，先讲宫排除？ <a href="#question-2" id="question-2"></a>

这个问题其实存在一个非常具有说服力的原因：因为宫的观察更简单。

虽然宫是数独所独有的一种概念（你想想看，别的表格类型的谜题玩法是不是一般都只有行和列两种要素），所以相对于其他谜题玩法来说，数独的宫的因素更为陌生。初学肯定是比较难受的。但是，它的外观是 3 × 3 的正方形形态。不论放在盘面的哪一个位置（左上角也好、右下角也好，中间也好，两边也好），似乎这个正方形的形状都不会因为放的位置而变化。

这个的好处在于，它更容易被我们的人眼所聚焦。所有的 9 个单元格分布在比较紧凑的一坨里，这反而让我们觉得宫的聚焦更加容易。剩下的就是数空格的填数缺少什么，以及走外面找“外援”（排除项）了。然后我们再反过来看行列排除。行列排除最致命的问题是，它是 1 × 9 或 9 × 1 的长条形状。但凡盘面稍微大一些（物理层面的大——像素点更多、图片更大之类的），我们的人眼就必须尝试去从上往下、从左往右扫描一遍完整的 9 个格子，才能得到缺少的数字。

而缺少的数字有些时候会比较难以得到。因为数数稍微慢一些的朋友会觉得，缺少的数字需要我们大脑里临时记一下，而本身长条形状的 9 个单元格会让我们做起题来潜移默化增大了难度——又要临时记忆，又要横纵大幅度扫描。这便是行列排除比较致命的问题。所以，它的推理逻辑都不难，难的点仅在于观察上。

我在建议你做题的时候，也使用先宫排除，后行列排除的方式来完成。在迫不得已的时候（例如题确实没有宫排除的可用结论，或实在是找不着宫排除的时候），再来找行列排除；灵活变动你的推理思维，这是最重要的。

### 问题 3：做题的方式？ <a href="#question-3" id="question-3"></a>

这是第一个讲解的数独技巧，因此需要给大家介绍一下，做题的一些方式和套路，以便在你不熟悉数独的时候也有一个下手的切入点。

数独虽然看起来难，它满篇都是数字，但它的题目在平时我们不论在 app 上，还是网上找到的打印的题目，都并不难。从最入门的技巧开始，排除都是我们的必经之路，因此，排除肯定是最常见的数独技巧，这样的题目也肯定占比更多。

这并不是说数独没有难题。但数独现阶段作入门来讲，排除肯定是最基础的技巧，所以不论难度怎么划分，只要是入门级的题，就势必可以只用排除技巧完成。我们不要拘泥于某个达成的目标，比如做题的耗时什么的。先从 0 到 1，再尝试从 1 到 10，再从 10 到 100。这个循序渐进的过程是必须有的。初学数独的时候，哪怕只用宫排除的题目，做 20 分钟甚至更多时间的朋友大有人在，而如果你一旦熟悉了这个技巧，那么提速就会非常快，甚至进入 10 分钟、5 分钟，甚至 3 分钟以内。我们一定要有耐心。

这是第一个要说的。第二个要说的是，我们怎么去找切入点。我拿一个例子给大家介绍一下，我是怎么做题目的。

<figure><img src="/files/yRaMdEwr18vgwv0TSDqx" alt="" width="375"><figcaption><p>一个宫排除的题目</p></figcaption></figure>

如图所示。我们要想完成它，就需要找一个切入点。我们刚才学到的排除，不论是宫还是行列排除，全都是只跟单一的数字有关的技巧。那么我们尝试按数字，将提示数分为 9 种不同的阶段来逐一完成；如果发现某一个数无论如何也完整完成不了，也别灰心，可能题就是这么设计的，那么跳到下一个数继续做就行了。

举个例子。这个题目我们先从数字 1 切入，看看 1 的分布都有哪些位置。很明显我们发现到，第 3、6、7 宫还没有填 1。刚才我们说我们优先找宫排除，所以我们就按第 3、6、7 宫的次序逐一击破即可。

> RCB 表达可以简写。例如第 3 宫、第 6 宫和第 7 宫可以直接把数字拼在一起，简写为 `b367`。这个用法后续可能会用到，到时候也会反复强调，直到我觉得你记住了它为止。

先看 `b3`。我们发现似乎 `b3` 并没有合适的、关于数字 1 的结论，因为似乎 `r1c7` 和 `r1c9` 都可以填 1，那我们就跳过它，来看 `b6`。`b6` 可以填 1 的位置只有 `r4c9`。这很明显。

<figure><img src="/files/bLSEk7Hjg5B6cHABQhWw" alt="" width="375"><figcaption><p>b6 填 1 的位置</p></figcaption></figure>

同理，`b7` 也存在可以填 1 的位置，将其填入。

<figure><img src="/files/v1mF0PCEAR5EMsTxPAwY" alt="" width="375"><figcaption><p>b7 填 1 的位置</p></figcaption></figure>

所以我们连续填出两个 1 的位置。由于 `b6` 填了 1，所以整个盘面里还剩下唯一一处 1 的位置，把他填上即可。

<figure><img src="/files/5V8P785KN0PwmJdQlfPX" alt="" width="375"><figcaption><p>1 全部填完</p></figcaption></figure>

这样一来，所有的数字 1 全部被我们击破。此时，盘面还剩下 8 种数字没有填了，我们继续填 2 即可。后面的数字就不再演示了。这个题的难度也不大，可以自己从头做一下。
