大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
链(Chain)是数独高阶技巧的核心,所有数独盘势都可以通过各种或简单或复杂的链来解出答案。链的本质是命题之间的关系,在解数独时,每个填数的步骤都可表现为在『A格中填入1』、『B格中填入2』这样非真即假的直言命题形式,如果条件不充足,命题真假不能判定,我们把数独中这种命题之间的真假关系称之为链。用链解题的逻辑在于,籍由命题真假值的推导,根据链两端点命题的真假来判断其共同作用格内候选数的真假。
强关系(Strong Links)和弱关系(Weak Links)
链可分为强链与弱链,分别由强关系和弱关系构成,定义如下:
强关系——对应矛盾关系和下反对关系,两个命题不可同假,必有一真(下反对关系可以同真);
弱关系——对应矛盾关系和上反对关系,两个命题不可同真,必有一假(上反对关系可以同假)。
图1小九宫格中,数字A只可能出现在R1C1和R3C3两个格中。根据数独规则,数字1-9在每个Unit(行Row、列Column、宫Box)中均需出现且仅出现1次,易知两个A之间为矛盾关系,两者不可同假,必为一真一假,可作出判断:(1)若 R1C1≠A,则R3C3=A,两个A之间为强关系,构成强链,记作R1C1{A}==R3C3{A};(2)若R1C1=1,则R3C3≠1,两个A之间为弱关系,构成弱链,记作R1C1{1}—R3C3{1}。
再看一个例子,图2中,数字A仅能出现在三个格中,根据数独规则,可知必有一个A为真,其余两个为假,则三个A两两之间不能同真,为上反对关系,可作出以下判断:(1)若R1C1=A,则R2C2、R3C3≠A;(2)若R2C2=A,则R1C1、R3C3≠A;(3)若R3C3=A,则R1C1、R2C2≠A。
在本例中,存在三条弱链,分别是R1C1{A}—R2C2{A}, R1C1{A}—R3C3{A}, R2C2{A}—R3C3{A}。
在以上两例中,可以看到,当某单元内特定候选数仅存在于两个格中时,两格中的该候选数是矛盾关系,二者之间既构成强链也构成弱链。而当该候选数存在于三个及以上格中时,两两之间是上反对关系,构成弱链。
强弱关系并不只局限于同一候选数,在图3九宫格中,R1C1中仅存在候选数A、B,R3C3中仅存在候选数A、B、C。如前两例,我们可知,R1C1格中的A和B为矛盾关系,二者之间即是强链也是弱链,R3C3中的A、B、C两两之间为上反对关系,构成弱链。
图4是复杂一点的情况,R1C1、R23C2三格中共有{1234}四个候选数(这种n格中有n+1个候选数的结构称为ALS——Almost Locked Set),根据数独规则,可知这四个候选数中有且只有一个为假,由强弱链定义易知1、2、3和4之间,两两互为强链。与前述矛盾关系的例子不同,本例{1234}中必有三个为真,则其两两之间为下反对关系,可以同真,不能构成弱链。
链是如何工作的
以上我们对强弱链有了基本的了解,接下来我们把链连接起来看看会发生什么。首先是强弱强链,A==B—C==D,我们根据强弱链的定义,画出真值表(只保留有效推导)
由图5可以看到,不论A取真值还是假值,在链的起点A和终点D中至少有一真,即A与D之间为强关系。我们仅考虑A为假的情况(若其为真,则已经可以用来删数),当A为假时,由于A、B、C、D由强弱链交替连接,推导如下:(1)若A为假,根据强链定义B只能为真;(2)若B为真,根据弱链定义C只能为假;(3)若C为假,根据强链定义D只能为真。
可见这种情况下只存在有一种有效推导形式,即A假D真,显然,只要保证以强链始以强链终, 即使将这条链不断延长下去仍可得出同样结论:若起点为假则终点必然为真。综上可知,强弱强链的两端点互为强关系,必有一个为真。
我们再来看弱强弱链的推导。A—B==C—D,真值表如下:
可见A与D中至少有一假,二者互为弱关系。将其不断延长,结果仍会是这样,推导过程不再赘述。这种情况不能直接用来删减A、D共同作用格的候选数。
如果将三条强链连接又会如何呢?A==B==C==D,从图7真值表中可以看到,链的两端点A和D一真一假、全真全假都有可能,也没有删减效果。
由以上推导我们可以总结,在数独解题过程中,链的工作模式是,找到数独盘势中的强链,用弱链将之连接,在此过程中保证强弱交替,以强链始以强链终,则链的两端点互为强关系,必有一真,若其存在共同作用格,则可对共同作用格内的相应候选数进行删减。
链的简单应用
来看一个例子,在图8的盘势中,可以找到一条从R1C4到R4C6的5的链(实线代表强链,虚线代表弱链,R1C4{5}==R1C9{5} — R4C9{5}==R4C6{5}),这条链强弱交替,且以强链始以强链终,可知R1C4的5与R4C6的5互为强关系,必有一个成立,不管哪个成立都可以删去R1C4、R4C6共同作用格(绿色区域)里的5。推导过程如右:(1)若 R1C4=5,则R2C6、R5C4≠5;(2)若R1C4≠5 → R1C9=5 → R4C9≠ 5 → R4C6=5,则 R2C6、R5C4≠5。
ps:上图中的结构称为摩天楼(Skyscraper),是双强链(强弱强链)的一种基础应用。
再看一个稍微复杂点的例子,在图9盘势中,可以找到一条从R4C6到R6C1的6的链(实线箭头代表强链,虚线代表弱链),可知R4C6与R6C1中的6互为强关系,必有一个成立,故可删去R4C6与R6C1共同作用格(绿色区域)内的6。大家可自行推导以加强对链的掌握。
作者:零时四分_719b
链接:https://www.jianshu.com/p/4c794e9969c3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167874.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...