困难数独技巧
处理显性数对、隐性数对和指向数对。
困难数独难在哪里
困难题只提供 25–29 个线索数——大约三分之一的棋盘。初期几乎没有单数(裸单和隐式唯余),候选数锁定也单独不够用。困难数独需要子集排除:同时对两个或三个格子操作的技巧,在不直接填入数字的情况下缩减候选数。
困难级别的核心技巧有:裸对、裸三元组、隐藏数对和指向数对。这些技巧初看陌生,但很快就能形成模式识别。关键的思维转变:你不总是在找"X 应该填在哪里"——有时你在找"什么结构让我能从某处排除 X"。
裸对:两格锁定两个值
裸对是指同一组(行、列或宫格)中,恰好有两个格子都只含有相同的两个候选数,且没有其他候选数。由于这两个格子必须各持这两个值之一(顺序不定),这两个值就不能出现在该组的其他任何地方。
排除逻辑:
- 在同一组中找到两个格子,每个格子恰好含有相同的数对——例如 {3, 7}。
- 这两个值被"预留"给这两个格子。其中一个是 3,另一个是 7(顺序未定)。
- 从该组所有其他格子的候选数列表中移除 3 和 7。
Row 5 candidates (after initial pencil-mark pass):
Col 1: {3, 7} ← pair cell A
Col 2: {1, 5, 9}
Col 3: {3, 7} ← pair cell B — same two values, no others
Col 4: {1, 5}
Col 5: {1, 5, 9}
Col 6: {5, 9}
Col 7: given
Col 8: given
Col 9: {1, 9}
Naked pair {3, 7} in cells (5,1) and (5,3).
→ One of those cells is 3 and the other is 7.
→ Remove 3 and 7 from cols 2, 4, 5, 6, 9 (every other cell in row 5).
Col 2 becomes {1, 5, 9} (unchanged — no 3 or 7 to remove)
Col 9 becomes {1, 9} (unchanged — no 3 or 7 to remove)
No eliminations happen here, but in other rows the same pair often frees up moves.
裸对产生的排除往往在同一组或相邻组中暴露出裸单或隐式唯余,引发连锁推断。应用技巧后,始终重新扫描受影响的行、列和宫格。
裸三元组
裸三元组是裸对的延伸:如果同一组中三个格子之间总共只有三个不同的候选数,这三个值就被锁定在这三个格子中。从该组所有其他格子中排除这三个值。
这三个格子不需要各自都含有全部三个值——只需确保它们不包含三个值之外的其他数字。常见形式(用值 {A, B, C} 表示):
- {A,B}、{B,C}、{A,C} ——每两个值各一对
- {A,B,C}、{A,B}、{B,C} ——一个完整三元组加两个子集
- {A,B,C}、{A,B,C}、{A,B,C} ——三个完全相同
裸三元组比裸对少见,但在困难题中仍会规律性地出现。系统性地扫描——先看宫格,再看行和列——是其他技巧受阻时的可靠策略。
隐藏数对:裸对的镜像
隐藏数对是裸对的对应物。不是寻找只有两个候选数的两个格子,而是寻找在某组中恰好只出现在两个格子里的两个数字——即使这两个格子有很多其他候选数。
如果数字 A 和 B 在某组中只出现在格子 X 和格子 Y 的候选数列表中,那么 X 必须是 A 或 B 其中之一,Y 必须是另一个。格子 X 和 Y 中的所有其他候选数都可以安全移除——这个数对"隐藏"在那些多余候选数之中。
Box (rows 4–6, cols 4–6) — scanning for digits 2 and 8:
(4,4): {1, 2, 5, 8} ← contains both 2 and 8
(4,5): {1, 5}
(4,6): {2, 5, 8} ← contains both 2 and 8
(5,4): {1, 5}
(5,5): {1, 5} ← no 2 or 8
(5,6): {1, 5}
(6,4): {1, 5}
(6,5): {1, 5}
(6,6): {1, 5}
Digits 2 and 8 appear as candidates in exactly two cells: (4,4) and (4,6).
→ Hidden pair confirmed: (4,4) must be 2 or 8; (4,6) must be 2 or 8.
→ Remove all other candidates from those two cells:
(4,4) becomes {2, 8}
(4,6) becomes {2, 8}
→ Now check: (4,5) = {1, 5} — is either a naked single? Not yet.
But the box now has fewer candidates; re-scan for new singles.
排除之后,隐藏数对所在格子往往会变成裸单,或形成新的裸对,进一步触发连锁推断。隐藏数对经常是解锁困难题的突破性一步。
指向数对与数三元组
中级数独中的候选数锁定(指向数对)在困难题中依然重要。困难题中候选数列表更密,指向数对不那么显眼,但逻辑完全相同:
- 对每个宫格,列出每个尚未填入的数字可以出现的位置。
- 如果所有位置都对齐在同一行或同一列,就从宫格外的该行或列中排除该数字。
在困难难度下,指向数对往往在裸对或隐藏数对排除之后才显现——候选数列表被精简后,之前无法看出的行列对齐才变得可见。每次子集排除后,立刻重新运行中级检查清单至关重要。
困难题中的行列-宫格削减
行列-宫格削减(某行或列中的数字候选数完全集中在一个宫格内)在困难题中依然适用。裸对排除之后,候选数列表更薄,之前分散在两个宫格中的数字可能现在只集中在一个宫格内——从而产生新的排除机会。
养成习惯:每次子集排除之后,对所有行、列和宫格重新执行候选数锁定和行列-宫格削减。困难题是技巧的链式反应,每步都让下一步变得可见。
决策树:何时使用哪种技巧
卡住时使用此决策树,从上到下依次尝试,任何一步成功后从头重新开始:
- 是否有裸单?→ 填入,然后重新开始。
- 是否有隐式唯余?→ 填入,然后重新开始。
- 是否有候选数锁定或行列-宫格削减?→ 排除,然后重新开始。
- 是否有同组内的裸对?→ 排除,然后重新开始。
- 是否有隐藏数对?→ 排除,然后重新开始。
- 是否有裸三元组?→ 排除,然后重新开始。
- 仍然卡住?→ 检查铅笔标记是否准确完整。重新推导任何可疑格子的候选数。
这个循环——填入、排除、重复——能解决绝大多数困难数独。错误几乎都源于候选数列表不准确,而非缺少某种技巧。