隐式技巧

隐式技巧是数独求解中的重要方法,通过分析候选数在区域中的分布来发现消除机会。类似于显集,隐集是解决数独谜题的核心解题方法。

隐单

隐单 (Hidden Single,也被译为排除) 是指当一个候选数在某个区域内只出现在一个格子中时,根据数独规则,该区域中必须要填入这个数字一次,所以这个数字只能填在这个格子里。

隐单示例

图中 列A (蓝色区域)的候选数 2 只出现在格子 A5 中,根据数独规则, 列A 中必须要填一个 2 ,所以 A5 中必须填 2 。因为格子 A5 中有多个候选数,答案比较隐蔽,所以叫 隐单

隐集

隐集 (Hidden Set 或 Hidden Subset,也被译为隐性数组) 是指在同一区域中,如果 n 个候选数只出现在 n 个格子中,其中 1n81 \leq n \leq 8,显然这 n 个数字只能填这 n 个格子里,所以这些格子中的其它候选数可以全部消除。

隐单 可以看作是 隐集 的特殊情况,当 n=1n = 1 时。

隐双

隐双 (Hidden Pair,也被译为隐性二数组、隐性数对) 是 隐集 n=2n = 2 的情况。也就是, 2 个候选数只出现在 2 个格子中。

隐双示例1

图中 宫9 (蓝色区域)中,候选数 68 只出现在格子 G7I9 中,所以,这 2 个数字只能填在这 2 个格子里,所以, G7I9 中的其它候选数可以全部消除。

隐双示例2

图中 行1 (蓝色区域)中,候选数 79 只出现在格子 B1G1 中,所以,这 2 个数字只能填在这 2 个格子里,所以, B1G1 中的其它候选数可以全部消除。

隐三

隐三 (Hidden Triple,也被译为隐性三数组) 是 隐集 n=3n = 3 的情况。也就是, 3 个候选数只出现在 3 个格子中。

隐三示例1

图中 宫3 (蓝色区域)中,候选数 159 只出现在格子 G2I2G3 中,所以,这 3 个数字只能填在这 3 个格子里,所以, G2I2G3 中的其它候选数可以全部消除。

隐三示例2

图中 行1 (蓝色区域)中,候选数 378 只出现在格子 B1D1F1 中,所以,这 3 个数字只能填在这 3 个格子里,所以, B1D1F1 中的其它候选数可以全部消除。

隐四

隐四 (Hidden Quadruple,也被译为隐性四数组) 是 隐集 n=4n = 4 的情况。也就是, 4 个候选数只出现在 4 个格子中。

隐四示例1

图中 宫7 (蓝色区域)中,候选数 3679 只出现在格子 A7B7A8B8 中,所以,这 4 个数字只能填在这 4 个格子里,所以, A7B7A8B8 中的其它候选数可以全部消除。

隐四示例2

图中 宫1 (蓝色区域)中,候选数 1389 只出现在格子 A1A2B2C2 中,所以,这 4 个数字只能填在这 4 个格子里,所以, A1A2B2C2 中的其它候选数可以全部消除。

如何发现隐集

识别 隐集 的关键步骤:

  1. 观察候选数分布 :在一个区域中,找出只出现在少数几个格子中的候选数
  2. 检查数量匹配 :检查是否有 n 个数字只出现在 n 个格子中:
    • 1 个数字只出现在 1 个格子中 → 隐单
    • 2 个数字只出现在 2 个格子中 → 隐双
    • 3 个数字只出现在 3 个格子中 → 隐三
    • 4 个数字只出现在 4 个格子中 → 隐四
  3. 消除其他候选数 :一旦找到 隐集 ,从这些格子中删除 隐集 数字以外的候选数

使用技巧

  • 从小到大搜索 :先寻找 隐单 ,再寻找 隐双 ,依此类推
  • 重点关注限制性候选数 :优先观察只出现在少数几个格子中的候选数
  • 结合显集技巧隐集显集 技巧相辅相成,可以交替使用

显集和隐集的互补关系

你可能会好奇:为什么在各种数独技巧例子中,从来没有见过显五、隐五这些技巧的例子呢?

这是因为,在数独中, 显集隐集 是一对互补的概念,也可以理解为,同一个消除逻辑的两种不同表达方式。当我们在一个区域中发现 显集 时,其它候选数会自然形成 隐集 ;反之,当我们发现 隐集 时,区域中未填写数字的其它格子也会形成 显集 ,并且他们消除的候选数是一样的。

例子1:显三与隐三互补

显集视角: 显集隐集互补示例1-显集

图中 行5 存在一个 显三 :格子集 {B5,C5,F5}\{B5, C5, F5\} 包含候选数集 {1,7,8}\{1, 7, 8\}

隐集视角: 显集隐集互补示例1-隐集

同一状态下,从隐集角度观察: 行5 存在一个 隐三 :候选数集 {3,5,6}\{3, 5, 6\} 只出现在格子集 {D5,G5,H5}\{D5, G5, H5\} 中。

可以观察到,两种视角消除的候选数完全相同。

例子2:隐三与显四互补

隐集视角: 显集隐集互补示例2-隐集

图中 行2 存在一个 隐三 :候选数集 {4,5,9}\{4, 5, 9\} 只出现在格子集 {A2,B2,F2}\{A2, B2, F2\} 中。

显集视角: 显集隐集互补示例2-显集

同一状态下,从显集角度观察: 行2 存在一个 显四 :格子集 {D2,G2,H2,I2}\{D2, G2, H2, I2\} 包含候选数集 {1,2,3,6}\{1, 2, 3, 6\}

可以观察到,它们消除的候选数也是一样的。

如何找互补集合

无论你已经找到的是隐集还是显集,同区域中,其它未填写数字的格子,就是它的互补集合所在的格子。


隐式技巧理论(选学)

隐集的定义

隐集 (广义,包含隐单)是指在一个区域 RR 中存在非空候选数集 SS,这些数字仅出现在该区域的格子集 CC 中,且 C=S|C| = |S|

隐集技巧的证明

命题 :在区域 RR 中,若存在候选数集 SS,这些候选数在区域 RR 中所在的格子集合为 CC,形成隐集,则:

  1. SS 中的数字将填入 CC 中的格子,且每个数字正好填写一次
  2. 格子集 CC 中不属于 SS 的候选数可以被消除

证明

根据隐集的定义,SS 中的候选数在区域RR中只出现在 CC 中的格子里

根据数独规则,可以知道,SS 中的每个数字必须填入 CC 中的某个格子。

又因为 S=C|S| = |C|,且每个格子只能填一个数字,所以 SS 中的每个数字正好填入 CC 中的一个格子。

所以,CC中不可能填写 SS 以外的数字。

所以,CC 中格子里不属于 SS 的候选数都可以被消除。

互补关系

显集的补集为隐集的证明

命题

在区域 RR 中,设 CUC_U 为该区域内未填写数字的格子集合,其候选数集合为 SUS_U,显然有 CU=SU| C_U | = | S_U| 。若 CUC_U 中的子集 CNCUC_N \subseteq C_U 构成一个显集,其候选数集合为 SN{S_N},设剩余的格子集合为 CH=CUCNC_H = C_U \setminus C_N ,设剩余的候选数 SH=SUSNS_H = S_U \setminus S_N ,则候选数集合SHS_H 在格子集 CHC_H 中形成隐集。

证明

注意,SHS_H 并不是 CHC_H 的候选数集合

根据 SHS_H 的定义,我们知道 SHS_H 中的数字未出现在已填的格子中,也未出现在 CNC_N 中。 所以 SHS_H 中的候选数在区域 RR 中只出现在 CHC_H 中。

CH=CUCN=CUCN |C_H| = |C_U \setminus C_N| = |C_U| - |C_N|

SH=SUSN=SUSN|S_H| = |S_U \setminus S_N| = |S_U| - |S_N|

因为 SU=CU|S_U| = |C_U|

另外,根据显集的定义,SN=CN|S_N| = |C_N|

所以 SH=CH|S_H| = |C_H|

所以 SHS_H 中的候选数在区域 RR 中只出现在 CHC_H 中,且 SH=CH|S_H| = |C_H|,这就是隐集的定义。

所以候选数集合SHS_H 在格子集 CHC_H 中形成隐集。

隐集的补集是显集的证明

命题

在区域 RR 中,设 CUC_U 为该区域内所有未填写数字的格子集合,其候选数集合为 SUS_U,显然有 CU=SU| C_U | = | S_U| 。若候选数集合为 SHS_H 中在 CUC_U 中形成隐集,设剩余的格子集合为 CN=CUCHC_N = C_U \setminus C_H,则 CNC_N 是显集。

证明

CNC_N 的候选数集合为 SNS_N

根据隐集的定义,SHS_H 中的候选数在区域 RR 中只出现在 CHC_H

所以这些候选数没有出现在 CNC_N

所以 SHSN=S_H \cap S_N = \emptyset

所以 SNSUSHS_N \subseteq S_U \setminus S_H

现在我们来计算一下集合大小:

CN=CUCH=CUCH|C_N| = |C_U \setminus C_H| = |C_U| - |C_H|

因为 SNSUSHS_N \subseteq S_U \setminus S_H, 所以:

SN<=SUSH=SUSH|S_N| <= |S_U \setminus S_H| = |S_U| - |S_H|

因为 SU=CU|S_U| = |C_U|

另外,根据隐集的定义,SH=CH|S_H| = |C_H|

所以 SN<=SUSH=CUCH=CN|S_N| <= |S_U| - |S_H| = |C_U| - |C_H| = |C_N|

显然,如果 SN<CN|S_N| < |C_N|,数独无解,所以:

SN=CN|S_N| = |C_N|

这就是显集的定义。所以 CNC_N 为显集。