直观隐性数组
Direct Hidden Subset
最后更新于
Direct Hidden Subset
最后更新于
如图所示。我们使用排除的逻辑,看 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 的全套规则全部介绍完毕了。之后我们会给各位列举一下它的一些详细规则。
下面我们再来看一则例子。希望各位这次能自己理解。
可能你会问我,文章不是介绍数组吗,为什么名字却是隐性数对而不叫隐性数组什么的。实际上是因为,和区块一样,数组在分了显性数组和隐性数组后,还有规格上的划分。前面我们学到的是数组里规格为 2 的情况,它是数组里最小规格的情况。下面我们来说一下隐性数组在规格为 3 的情况。
如图所示。和前面的解释逻辑相似,只是这次我们要一并用到三个单元格。
只看 b9
,我们可以看到,数字 1 能填入的位置只有 {r8c78, r9c8}
三个单元格,而恰好的是,数字 8 和 9 也都恰好只能填入在这三个单元格里。
很明显的是,数字 1 必须在其中预留一个席位,2 和 3 也都需要预留一个席位,这样三个单元格就被全部占满。这样一来,这三个单元格就没有任何机会填入其他别的数字。和前文一样,在没有这一层的逻辑之前,4 是可以填在 r8c78
里的;而现在我们有了 r8c78 <> 4
,利用这一点,数字 4 在 r8
就只能填在 r8c5
里。所以这个题目的结论就是 r8c5 = 4
。
我们把图中的 {r8c78, r9c8}(123)
称为隐性三数组(Hidden Triple)。
下面我们来看规格为 4 的情况。在平时做题里,规格为 3 和 4 的情况相对比较少见,所以我们只看下用例即可,平时做题基本遇不到这些题目。
这次我们仍旧关注于 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 表达进行一轮完整的说明。
对于单个单元格:直接用 r<行号>c<列号>
表示,其中 <行号>
和 <列号>
替换为具体的行列编号;
对于多个单元格:
如果它们的行一致,或它们的列一致,则合并它们的行或列(只写一次),并列举另一边的所有编号数值:
如果合并后还具有相同的行号序列或列号序列,就还可以继续合并,直到无法合并为止;
如果合并后无法继续合并,就直接用这个结果表示即可。
如果它们的行号和列号都不一样,则直接用大括号括起来即可。
直接使用小括号把所有用到的数字括起来即可。
如果结论是得出一处单元格的填数(简称出数(Assignment)),则使用等号 =
连接单元格和数字;
如果结论是得出某一个单元格不能填入什么数字或一组数字(简称删数(Elimination 或 Deletion)),则使用不等号 !=
或 <>
连接单元格和数字。
下面我们来一些小练习:写出它们的 RCB 表达。
单元格 r2c3
、r2c5
和 r2c9
;
单元格 r1c23
、r2c234
和 r3c234
;
单元格 r1c3
应填入数字 7;
单元格 r2c56
不应填入数字 2 或 6;
单元格 r1c8
的数字 1、2、3、5;
单元格 r1c89
不能是 8 或 9;
第 3 行;
第 4 宫;
第 2 列的全部数字 2。
答案:
r2c359
{r1c23, r23c234}
,或者 {r123c23, r23c4}
也行
最好不要写成 {r23c23, r23c4, r1c34}
,因为会多一项,可理解为数学上的“不是最简形式”
r1c3 = 7
r2c56 <> 26
r1c8(1235)
r1c89 <> 89
r3
b4
c2(2)