鱼 (Fish) — 概述
简介
"鱼"这个术语表示一组从同一原理出发的技巧,但已经衍生出令人难以置信的多种变体(就像真正的鱼一样)。它们从简单的X-Wing(可以在任何教程中找到)开始,一直到自噬鳍变异利维坦。较大的物种相当难以手动找到,更常被计算机程序使用,但较简单的物种相当容易发现,并且可以相当快地推进数独。
鱼是单数字模式。"单数字"意味着在寻找鱼时只考虑同一数字的候选数。"模式"意味着候选数在网格中的位置很重要。这个术语用于将它们与链区分开来。
原理
鱼背后的原理非常简单:寻找一定数量的不重叠的宫。这些宫称为基础集(set在这里与house同义),其中包含的候选数是基础候选数。不重叠意味着任何基础候选数只包含在一个基础集中,集合本身可以重叠。现在寻找相同数量的不同不重叠的宫来覆盖所有基础候选数。这些新集合是包含覆盖候选数的覆盖集。如果存在这样的组合,则所有不是基础候选数的覆盖候选数可以被消除。
工作原理
鱼利用了这样一个事实:一个数字在一个宫中只能出现一次。由于我们只考虑同一数字的候选数,任何基础集必须恰好包含一个具有鱼值的格子。覆盖集也是如此。由于所有基础候选数既是覆盖集的一部分也是基础集的一部分,候选数的可能放置变得非常受限。如果我们有N个基础集和N个覆盖集,则恰好N个格子必须包含鱼数字。数独规则确保在每个覆盖集中恰好有一个基础候选数必须被设置。我们通常不知道是哪个,但我们知道它必须是一个,所以任何不是基础候选数的覆盖候选数都不是可能的放置。它们可以被消除。
形状和尺寸
基础集/覆盖集的数量定义了鱼的大小。以下尺寸已被命名:
| 尺寸 | 名称 |
|---|---|
| 2 | X-Wing |
| 3 | 剑鱼 (Swordfish) |
| 4 | 水母 (Jellyfish) |
| 5 | 蠕虫 (Squirmbag) |
| 6 | 鲸鱼 (Whale) |
| 7 | 利维坦 (Leviathan) |
类型(基础集/覆盖集组合)
有三种类型的鱼,它们在基础集和覆盖集允许的宫类型上有所不同。基础鱼只使用行和列:行作为基础集,列作为覆盖集,或反之。弗兰肯鱼允许宫与行和列一起使用,但只有一方(基础或覆盖)可以使用宫。变异鱼允许在任一方或双方中使用行、列和宫的所有可能组合。
记法示例:4 c39 r46 表示数字4的基础X-Wing(基础:列3和9;覆盖:行4和6)。4 c39b8 r469 表示弗兰肯剑鱼。4 r159c9 c45b36 表示变异水母。
鳍(外鳍)
当基础候选数未被覆盖集覆盖时,这些剩余物称为外鳍,鱼变成鳍鱼。消除逻辑是:要么所有鳍为假(给出正常的鱼消除),要么一个鳍为真(消除能看到鳍格子的候选数)。因此,所有能看到所有鳍的可能消除可以被消除。
刺身
一些退化鱼模式包含更小的有效鱼。当鳍阻止那个更简单的鱼运作时,该模式称为刺身。HoDoKu默认对所有非基础鱼类型使用"鳍鱼"。
内鳍
当基础候选数位于多个基础集中时,将其视为内鳍可以恢复有效性。内鳍只能出现在弗兰肯或变异鱼中,由于巨大的组合空间,人类很难找到它们。
自噬
当基础候选数被两个或更多覆盖集覆盖时,放置该候选数将迫使一个覆盖集包含两个鱼数字——违反数独规则。这样的候选数必须为假,可以被消除。鱼"几乎在吃自己",因此称为自噬鱼。当有鳍存在时,自噬消除只在候选数能看到所有鳍时适用。
内容基于 HoDoKu,作者 Bernhard Hobiger,授权于 GNU FDLv1.3。