zoukankan      html  css  js  c++  java
  • 数独高阶技巧入门之三——Fish

    术语Fish代表了一组工作原理相同的关于特定候选数的解题技巧(Fish技巧直接产生自数独规则——每个单元内的数字都不能重复),Fish家族成员包括“体型”从小到大的X-Wing、Swordfish、 Jellyfish、Squirmbag、 Whale以及Leviathan(后三者在人工解题过程中很少用到,本篇不做展开),以及由标准Fish结构延伸出来的Finned/Sashimi Fish。

    X-Wing——若数字A在某两行(列)中只能存在于相同的两列(行),则这两列(行)的其他格都不能有A。

    其原理很简单,如图1所示,我们将数字A只能存在于两个位置的行(列)称为base集(黄色),把与之垂直方向的列(行)称为cover集。显然,根据数独规则,在Base集中要吗是红色的一组A成立,要吗是蓝色的一组A成立,无论哪个颜色的A成立,都可以相应删去cover集行或列中其他格(橙色区域)的数字A。在具体操作时,大家可以将步骤简化为,在数独盘势中寻找一个数字A的2行×2列的矩形,若A在某个方向(横、纵)的行、列中只能出现于两个位置,就删去与之垂直方向的行、列中其他格的数字A。

     
    图1 X-Wing01

    ​来看下面的实例。图2中数字5在R2和R5行中均只能存在于C5和C8列,则R2和R5的5构成Base集, C5和C8列的5为cover集,可删去cover集其他格中的的5(红色)。

     
    图2 X-Wing02

    ​图3中数字1在C1和C5列均只能存在于R2和R5行,base集=C15{1}, cover集=R25{1}, 可删去cover集其他格中的1(红色)。

     
    图3 X-Wing03

    ​Swordfish——若数字A在某三行(列)中均只能存在于相同的三列(行),则这三列(行)的其他格都不能有A。

     
    图4 Swordfish01

    ​本篇开头已经提到,Fish家族的解题技巧都有着同样的工作原理,只是“体型”大小不同。X-Wing是2行2列2×2的矩形,Swordfish则将其扩展到3行3列。如图4中,黄色行列为base集(数字A在该单元仅能出现于3个位置),与之垂直的方向为cover集。根据数独规则,数字A在这个3行3列的矩形中,必然是每行每列出现且仅能出现1次,故可删去cover集中其他格内(橙色区域)的A。

    需要注意的是,在Swordfish结构中,base集每个行列的A未必要出满3个位置,如下图,只要满足3行3列,且base集中的A在垂直方向只能出现于cover集内,依然是有效的Swordfish结构(其他Fish结构同样如此)。

     
    图5 Swordfish02

    ​来看两个Swordfish的实例。

     
    图6 Swordfish03

    ​图6中,数字2在R2、R3和R9中(base集),均只能出现C1、C5和C8列(cover集),则可删去cover集其他格内的2(红色)。

     
    图7 Swordfish04

    ​图7中,base集=R247{4},cover集=C235{4},可删去cover集红色的4。

    Jellyfish——若数字A在某四行(列)中均只能存在于相同的四列(行),则这四列(行)的其他格都不能有A。

    Jellyfish进一步将Fish结构扩大到4行4列,我们直接看实例。

     
    图8 Jellyfish01

    ​图8中,数字7在R3、R4、R6和R7(base集)中,只能出现于C1、C2、C5和C9(cover集),可删去cover集其他格的7(红色)。

     
    图9 Jellyfish02

    ​图9中,base集=R1367{7},cover集=C2589{7},删去cover集其他格内红色的7。

    Finned/Sashimi Fish

    大家都知道六书中有“指事”一法,“指事者,视而可识,察而见意”, 如“刃”字是在“刀”的锋利处加上一点,以作标示;“凶”字则是在陷阱处加上交叉符号以作提醒。数独解题技巧中的Finned/Sashimi Fish与造字法中的“指事”有着异曲同工之妙。我们来看一个例子:

     
    图10 X-Wing

    上图是一个标准的X-Wing结构,可删去C3、C5中红色的9。但是,如果X-Wing这条鱼在base集多出来一条鳍(fin)怎么办,比如在R2C1格中加上1个9,变成图11这样:

     
    图11 Finned X-Wing

    我们可以这样推导:1)如果R2C1中多出来的9不成立,则局面变为图10中的标准X-Wing结构,可删去R3C3、R5C3、R5C5中的9;2)如果R2C1中的9成立,则可删去与之同一单元的R2C35、R3C3中的9。结合上述两种可能,可以发现,无论R2C1中的9是否成立,都可以删去R3C3中的9

    直观来看,多出来的fin将Fish结构cover集的删减范围限制在它所在的宫中,起到了“指事”法标识、定位的作用,我们把这种多长了鳍的Fish结构称为Finned Fish。

    再开看一个Finned/Sashimi X-Wing的例子:

     
    图12 Finned/Sashimi X-Wing

    ​图12中C3和C6为base集,R3和R7为cover集,C3列R89中的两个3为fin(大家需要注意,虽然本例的X-Wing中,若去掉R89C3的两个3之后,C3列可以直接出数,但它仍是个标准的X-Wing结构,因为它严格符合X-Wing的定义:数字A在某两行、列中只能存在于相同的两列、行。我们把类似这种base集中某个位置已有确定的其他数字填入——即原有的Fish少了一部分的结构称为Sashimi Fish)。可删去fin与cover集共同作用格亦即本例中R7C1格内的3。

    下图是一个Finned Swordfish的例子,base集=C159{7},cover集=R357{7},R1C9的7为fin,可删去fin与cover集共同作用格R3C7内的7。

     
    图13 Finned Swordfish

    ​下图是一个Finned/Sashimi Swordfish结构(注意本例的情况与图12相似),base集=R269{2},cover集=C258{2},R6C4的2为fin,可删去fin与cover集共同作用格R45C5内的2(红色)。

     
    图14 Finned/Sashimi Swordfish

    最后在文末提供一个Finned/Sashimi Jellyfish的盘势供大家揣摩。

     
    图15 Finned/Sashimi Jellyfish01


    作者:零时四分_719b
    链接:https://www.jianshu.com/p/ccf42a052af4
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    C#学习(四)
    C#学习(三)
    sqlserver基本操作
    ado.net(1)
    wpf的学习日志(一)
    C#学习(二)
    三大范式
    存储过程
    事务
    范文模板
  • 原文地址:https://www.cnblogs.com/asdyzh/p/10125281.html
Copyright © 2011-2022 走看看