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

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

摩天楼(Skyscraper)

图1-摩天楼 Skyscraper

?如图1,当数字A分别在某两行、列只能出现在两个可能的位置(这样就保证了数字A在该行、列的两个候选数构成强链),且其中一侧处于同一列、行(base)时,则可删去另一侧(cover)两个端点共同作用格(黄色区域)内的数字A。来看下图的实例。

图2-SK01

在图2中,数字1在C6、C9列只能出现在两个位置,且R5C6和R5C9同处于R5行(base),显然这是个典型的强弱强链(R1C6==R5C6 — R5C9==R3C9),cover侧R1C6和R3C9之间为强关系,必有一真,可以删去它们共同作用格内的数字1(红色)。

上例是数字A在两列中只出现于两个位置的摩天楼结构,我们再看一个位于两行的摩天楼。图3中数字4在R2、R8中只出现在两个位置,R2C1和R8C1同处于C1列(base),可删去cover侧R2C5与R8C4共同作用格内的候选数4(红色)。

图3-SK02

双线风筝(2-String Kite)

图4-双线风筝 Two Strings Kite

当数字A在一行、一列均只能出现在2个可能位置(保证是强链),且该行和列的一个端点同处于同一宫(base),则可以删除另两个端点(cover)的共同作用格(黄色区域)内的候选数A。来看实例:

图5-2SK01

图5中R8和C7中的5只能出现在两个位置,且R8C9的5和C7R9的5同处于B9宫(base),我们可以形象的把同处一宫的部分看作风筝的躯干,另一侧的两端点(cover)看作风筝的两翼,显然风筝的两翼R8C4和R2C7之间为强关系(R8C4==R8C9 — R9C7==R2C7),可删去它们共同作用格内的候选数5(红色)。

再来看一个例子,图中R6、C2的9构成2-String Kite结构,B4宫中R6C1与C2R4的9为base,可删去cover侧R6C6、C2R7共同作用格内的候选数9(红色)。

图6-2SK02

多宝鱼(Turbot Fish)

图7-多宝鱼 Turbot Fish

摩天楼、双线风筝结构分别是数字A在某两行(列)或是某行和某列只出现在两个位置的情况,而多宝鱼结构则是数字A在一行(列)和一宫中只能出现在2个可能的位置,且行(列)的一个端点和宫的一个端点位于同一行(列)(base),则可以删除另两两个端点(cover)共同作用格的候选数A。

图8-TF01

?图8中,C1列和B8宫中的6均只能出现在两个位置,且C1R9和C6R9同处于R9行(base),显然另一侧(cover)两端点R6C1 与R7C4之间为强关系,可删去其共同作用格(红色)内的6。图9的例子大家可自行推导。

图9-TF02

空矩形(Empty Rectangle)

图10-空矩形 Empty Rectangle

?空矩形实际上是多宝鱼结构的延伸。如果数字A在某宫(图10中的B9、B7)中的橙色矩形区域(这是空矩形得名的由来)不能存在,可以直观的看到,它只能出现在该宫的蓝色区域,且必然是一行一列的交叉。如果在蓝色区域的行和列中,A均只出现在一个位置,此时若在该宫之外存在某行、列数字A的强链,且其一端点与宫中的数字A的一端点同处于一行(列),显然这是个典型的多宝鱼结构,可相应删去cover侧共同作用格的候选数。但是蓝色区域行、列内的数字A不只1个时,该怎么办?

对强弱关系掌握比较好的朋友可能已经想到了解决方法——将分处于行、列中的候选数打包起来分成两组(group),用整体思维来解决这种情况,如下图:

图11-Group

我们将蓝色区域内base侧的A(红框内)打包为一组,将其余的A(粉框内)打包为另一组,由于该宫其它位置不能出现A,显然这两组A之间为矛盾关系,可以构成强链。而红框内的三个A则和base侧的另一个A构成弱关系,这样就形成了经典的强弱强链,可删去黄色区域内的候选数A。

提供两个例子供大家自行推导揣摩。

图12-ER01

?图13中的橙色区域依然是空矩形。

图13-ER02

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

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

时间: 2024-10-04 10:02:59

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

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

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

数独高阶技巧之八——SDC

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

机器学习高阶训练营知识点一览<二>

第三阶段 无监督学习与序列模型 [核心知识点] - K-means.GMM以及EM - 层次聚类,DCSCAN,Spectral聚类算法 - 隐变量与隐变量模型.Partition函数 - 条件独立.D-Separation.Markov性质 - HMM以及基于Viterbi的Decoding - Forward/Backward算法 - 基于EM算法的参数估计 - 有向图与无向图模型区别 - Log-Linear Model,逻辑回归,特征函数 - MEMM与Label Bias问题 - Li

07.Javascript——入门高阶函数

高阶函数英文叫Higher-order function..JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, Math.abs)时,参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,我们可以推导计算过程为: x = -5;

Haskell高阶函数

Haskell functions can take functions as parameters and return functions as return values. A function that does either of those is called a higher order function. Higher order functions aren't just a part of the Haskell experience, they pretty much ar

python中的高阶函数

高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身. 要获得函数调用结果,我们可以把结果赋值给变量: >>> x

Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码

Python 高阶函数【转】

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条

初识python:高阶函数

定义: 变量可以指向函数,函数的参数能接收变量,那么,一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. 简单说就是:把函数当差参数传递的函数就是高阶函数 原则: 1.不能修改被装饰函数的源代码: 2.不能修改被装饰函数的调用方式. 实例1: # abs 内置取绝对值函数 def add(a,b,f): return f(a) + f(b) #a的绝对值+b的绝对值 print(add(1,-2,abs)) # 取3,-6的绝对值之和 返回值:3 在不修改被装饰函数源代码的情况下为其