数独高阶技巧入门之一:链及其简单应用

链(Chain)是数独高阶技巧的核心,所有数独盘势都可以通过各种或简单或复杂的链来解出答案。链的本质是命题之间的关系,在解数独时,每个填数的步骤都可表现为在『A格中填入1』、『B格中填入2』这样非真即假的直言命题形式,如果条件不充足,命题真假不能判定,我们把数独中这种命题之间的真假关系称之为链。用链解题的逻辑在于,籍由命题真假值的推导,根据链两端点命题的真假来判断其共同作用格内候选数的真假。

强关系(Strong Links)和弱关系(Weak Links)

链可分为强链与弱链,分别由强关系和弱关系构成,定义如下:

强关系——对应矛盾关系和下反对关系,两个命题不可同假,必有一真(下反对关系可以同真);

弱关系——对应矛盾关系和上反对关系,两个命题不可同真,必有一假(上反对关系可以同假)。

图1-矛盾关系

?图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-上反对关系

?再看一个例子,图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-矛盾关系、上反对关系

强弱关系并不只局限于同一候选数,在图3九宫格中,R1C1中仅存在候选数A、B,R3C3中仅存在候选数A、B、C。如前两例,我们可知,R1C1格中的A和B为矛盾关系,二者之间即是强链也是弱链,R3C3中的A、B、C两两之间为上反对关系,构成弱链。

图4-下反对关系、ALS

图4是复杂一点的情况,R1C1、R23C2三格中共有{1234}四个候选数(这种n格中有n+1个候选数的结构称为ALS——Almost Locked Set),根据数独规则,可知这四个候选数中有且只有一个为假,由强弱链定义易知1、2、3和4之间,两两互为强链。与前述矛盾关系的例子不同,本例{1234}中必有三个为真,则其两两之间为下反对关系,可以同真,不能构成弱链。

链是如何工作的

以上我们对强弱链有了基本的了解,接下来我们把链连接起来看看会发生什么。首先是强弱强链,A==BC==D,我们根据强弱链的定义,画出真值表(只保留有效推导)

图5-强弱强链真值表

由图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,真值表如下:

图6-弱强弱链真值表

可见A与D中至少有一假,二者互为弱关系。将其不断延长,结果仍会是这样,推导过程不再赘述。这种情况不能直接用来删减A、D共同作用格的候选数。

图7-强强强链真值表

如果将三条强链连接又会如何呢?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。

图8-Skyscraper

ps:上图中的结构称为摩天楼(Skyscraper),是双强链(强弱强链)的一种基础应用。

再看一个稍微复杂点的例子,在图9盘势中,可以找到一条从R4C6到R6C1的6的链(实线箭头代表强链,虚线代表弱链),可知R4C6与R6C1中的6互为强关系,必有一个成立,故可删去R4C6与R6C1共同作用格(绿色区域)内的6。大家可自行推导以加强对链的掌握。

图9-异数链

作者:零时四分_719b
链接:https://www.jianshu.com/p/4c794e9969c3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/asdyzh/p/10145009.html

时间: 2024-10-07 15:45:36

数独高阶技巧入门之一:链及其简单应用的相关文章

数独高阶技巧入门之二:简单的单数链结构——双强链

?如果在数独盘势中,我们找到关于某个候选数的两条强链,且这两条强链的一侧在同一单元(行.列.宫)内,称为base,另一侧有共同作用格,称为cover.根据前篇<链及其简单应用>中的定义,base侧两端点之间不是矛盾关系就是上反对关系,它们之间必然可以是弱链.很明显这是个典型的强弱强链,其两端互为强关系,必有一真,据此可以删去cover侧两端点共同作用格内的候选数.我们将这种简单的单数链结构称之为双强链,双强链结构主要包括摩天楼(Skyscraper).双线风筝(2-String Kite).多

数独高阶技巧之八——SDC

在本系列的第四篇"简单异数链"中,向大家介绍了XY-Wing等一系列Wing类技巧,并提到可以用(拐弯的)数组的观念来理解这些结构,经过第六篇ALS的学习之后,大家回过头再去看Wing,应该可以发现相关的实例都可以用ALS去解释.本篇则要介绍一种与上述结构类似的删除技巧--SDC(Sue de Coq). 一.基本形态 Sue de Coq这个命名来自于SDC技巧最早发现者的论坛昵称,更正式的名称应该是Two-Sector Disjoint Subsets(双分离子集删除法),我们先来

JS高阶---作用域与作用域链

大纲: 主体: (1)概论 (2)层级 执行上下文层级为n+1原则 作用域层级也是n+1原则 验证: (3)函数作用域作用 隔离变量,不同作用域下,相同变量名不会有冲突 (4) . 原文地址:https://www.cnblogs.com/jianxian/p/11971058.html

Swift 烧脑体操(三) - 高阶函数

前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困难.不过一切都是值得的,Swift 相比 Objective-C,写出来的程序更安全.更简洁,最终能够提高我们的工作效率和质量. Swift 相关的学习资料已经很多,我想从另外一个角度来介绍它的一些特性,我把这个角度叫做「烧脑体操」.什么意思呢?就是我们专门挑一些比较费脑子的语言细节来学习.通过「烧

python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来的出想要的结果,只要是输入时确定的,输出就是确定的. 1.2高阶函数 能把函数作为参数传入,这样的函数就称为高阶函数. 1.2.1函数即变量 以python的内置函数print()为列,调用该函数一下代码 >>> pri

python函数(全局变量,局部变量,作用域,递归函数,高阶函数,匿名函数)

1.1函数 1.1.1什么是函数 函数就是程序实现模块化的基本单元,一般实现某一功能的集合.函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态. 1.1.2函数的作用 函数是组织好的,可重复使用的,用来实现单一,或者相关功能的代码. 函数能够提高应用的模块性,和代码的重复利用率 我们已近知道python提供了许多内置函数,比如print(),我们自已创建的

阿里云王牌架构师杨曦:也谈系统缓存设计误区及高阶使用技巧

阿里云高级解决方案架构师 杨旭世界最大混合云的总架构师,4年前,开始作为双11阿里云技术负责人,负责搭建全球最大的混合云结构,把 "双11"的电商业务和技术场景在阿里云上实现,并保障这个混合云在双11当天能够满足全球客户的购物需求. 正文 相信很多研发同学都有过引入缓存进入到应用架构设计中的经历,本文从几个角度阐述一些选型误区和使用误区以及高阶使用技巧等,供开发者参考. 什么情况下开始考虑缓存? 缓存的主要目的是为了挡一些读多写少的用户请求,且数据在一定时间周期内保持不变,再且业务允许

【ZZ】从入门到高阶,你需要刷哪些书?丨高中物理竞赛辅导书推荐

无论你是初试牛刀的初学者,还是渐入佳境的潜力新星,亦或是经验丰富的竞赛老将,一份适合自己的书单总是奥赛学习的致胜法宝.本期推送,我们针对物理竞赛整理了一系列经典书目.希望大家可以结合自身经历.基础实力,选择适合自己的奥赛书籍,让一本本好书陪伴自己走完这段美丽而艰辛的竞赛生涯. 入 门 书 单 ▼01.高中物理学 沈克琦 主编2015-07-01中国科学技术大学出版社 02.新概念物理读本 赵凯华,张维善 著2009-02-01 / 人民教育出版社 这两套书的特点都是从高中物理.从零开始讲起.也就

React17React高阶组件的链式调用

使用情况如下: * 编写一个高阶组件进行属性的添加 * 编写一个高级组件编写生命周期 * 然后将以上两个高阶组件进行链式调用 示例 * 编写高阶组件进行属性的添加(返回的是函数组件): * 编写高阶组件重写生命周期(返回的是class组件): *链式调用 widthLearnReact为HOC组件添加了属性,widthLiseCycle为添加了属性的HOC组件重写了componentDidMount生命周期 注这种高阶组件链式调用太过麻烦,下篇随笔采用装饰器的语法处理这种问题. 原文地址:htt