昆仑  
HandBook  

KLSudoku传统数独游戏软件用户手册1.1版本

申明

本手册可以从项目Wiki地址获取到最新版本: http://code.google.com/p/klsudoku/wiki/HandBook

授权申明:未经ttylikl授权,本手册全部章节内容都禁止任何媒体和商业组织的转载。个人可以转载全部或部分章节内容到个人网络媒体(如博客)上,但是转载时请保留手册来源说明。

目录

名词解释

英文 中文 说明
Cell 数格 每一个需要填写(或者已经填写数字的小方格)
Row 数独里横向的9个数格组成一行,数独由9个各不相交的行组成。
Column 数独里纵向的9个数格组成一列,数独由9个各不相交的行组成。
Box 块,宫,九宫 数独里横向和纵向各3个数格组成的方阵称为一个块,数独由9个各不相交的块组成。
House、RCB 行列块 对行列块的统称或者说简称,根据上下文语义,可能代表行或者列,或者块
Group 对某一个数格,其group为由它所在行、列、块的所有方格组成(不包含该数格),所以group还有另外一个英文名peers20
Candidate 候选数 在一个数格里,尚未排除的可能的数字1-9,称为候选数。当一个数格里只剩余一个候选数的时候,或者一个house里只有某个数格有某候选数时,那么此候选数就是该数格的唯一候选数

数独游戏的规则说明

  1. 数独游戏里的每一行(Row),有数字1-9,每个数字出现且仅出现一次
  2. 数独游戏里的每一列(Column),有数字1-9,每个数字出现且仅出现一次
  3. 数独游戏里的每一块(Box),有数字1-9,每个数字出现且仅出现一次

除了上面的三个基本规则,数独游戏还有其余的几个规则:

  1. 每一个数独题一定有解
  2. 每一个数独题最多只有一个解

数独题有且只有一个解的特性,在一些解题的进阶技巧里也经常使用到。

KLSudoku的界面操作说明

普通模式的操作说明

普通模式即非候选数模式,在这种游戏模式下,在9 X 9的数格里,只会出现初始局面的数字以及用户自行填写的数字。你需要自行推断出某个数格应该填写什么数字,然后通过按键或鼠标直接填写。

在普通模式下进行游戏,需要了解以下几个问题:

  1. 如何确定对哪个数格操作?
  2. 如何填写自己想要的数字?
  3. 如何标记可能的候选数?

在普通模式下,KLSudoku也提供了使用颜色标注数格和候选数来进行提示的辅助手段。在遇到困难局面时,可以使用提示来继续进行游戏。

热点数格

在KLSudoku里,使用了一个热点数格的方式来标识将要对哪个数格操作,如上图里的A9数格被填充为橙色,表示它即为当前的热点数格。 热点数格会跟随鼠标移动,但是也可以不使用鼠标,而使用箭头键上下左右进行移动。

在热点数格里填数

可以使用鼠标点击的方式,或者通过键盘按键的方式对热点数格进行填数操作。要注意的是,如果你想要进行填数,并且所填的数字明显违反了1.2节游戏规则的时候,你的填数操作无效,可能不会有任何界面上的变化出现。

使用鼠标方式时,如同上图所示,可以通过点击9 X 9 的数格方阵上面表示列数的数字来改变默认的操作数字,当前的操作数字会以灰色背景和黑色数字来凸显出来。

当在热点数格上点鼠标左键的时候,即代表要在这个数格填写默认操作数字。但是如果在点鼠标左键的同时还按住了CTRL键,则代表要在热点数格增加一个和默认操作数字相同的候选数(在普通模式,不自动显示候选数,但是可以自行添加删除候选数)。

如 果不使用鼠标,一样可以通过键盘的方式进行游戏。热点数格可以通过箭头键在9 X 9的数格内逐个移动。当移动到边界的时候,如果继续移动,则热点数格会从另外一个方向出现。 当热点数格到达期望的位置后,可以直接按下键盘上的数字按键1-9来在热点数格填写数字。如果在按下数字按键的同时,你还按住了CTRL键,那么也同样会 在热点数格添加该数字为候选数而不是填写该数字了。

其余操作热点数格的方法

虽然用鼠标可以快速的定位热点数格和进行填数操作,但是往往还得在填数之前先去选择默认操作数,这显然很影响操作的舒适感。所以在KLSudoku里增加了一个功能,如果在热点数格上点击鼠标右键,则会弹出一个快捷标签弹窗,可以通过该弹窗进行快捷的操作。

在快捷标签弹窗里包含了填数和设置候选数两个选项卡,每个选项卡上都有数字0-9,如下图所示。

标 签弹窗出现后,你可以先根据自己想要进行的操作,选择候选或者填数的标签。弹窗会记忆上一次出现时所选择的标签,在很多时候,这个小小的特性可以方便不少 操作。 选择标签后,可以点击相应数字,如果使用鼠标左键点击数字后,弹窗立即隐藏消失,同时会对热点数格进行填数操作或者添加候选数的操作。如果是鼠标右键点击 了数字或者标签弹窗,则弹窗立即隐藏消失,也不会对热点数格进行任何操作。

在普通模式使用解题提示

在 普通模式下,KLSudoku可以针对显式和隐式唯一数法给出使用颜色提示的,如上图就展示了一个隐式唯一数的推导过程。 而下图则展示了一个显式唯一数的推导过程,在H8所在行,列,宫(块)里,可以找到数字1-8,所以H8只能填写数字9,在直观解法里,这也叫做唯一余数 法。

在普通模式下,对于一些其他的高级解题技巧,在获取提示的时候,KLSudoku会将相关的一些数格的候选数显示出来,以帮助你理解其推理过程。下图展示了区块排除法的推理过程:

需要说明的是,即使是在普通模式下,如果使用了提示,那么提示中涉及的关键数格的其余候选数也会被显示出来。例如在上图中,数格A8,A9,B8,C8,C9除了候选数7,其余可能的候选数也会被显示出来。

候选数模式的操作说明

候选数的自动显示原则

在候选数模式下,KLSudoku将自动计算每一个未填写数字的数格内可能的候选数。计算的原则为将所在行,列,宫里出现过的数字排除掉。换一句话说,当如果一个数格填入了一个数字,那么在这个数格所在的宫,行,列里的其他所有数格的候选数就不会再有这个数。

下面的图做了一个简单的说明:

例如E4数格为数字7,所以在E行和4列,以及E4所在的中九宫里,所有的数格都不会有候选数7。候选数的这个自动显示是基于传统标准数独的三条基本游戏规则来实现的。

普通模式和候选数模式的切换

在上图中还标明了可以通过点击工具栏按钮上的“候选数”按钮来显示或者隐藏所有数格的候选数。 除了这个快捷操作方式,还可以点击菜单“编辑”->“选项”,然后在弹出的选项窗口里,点击“显示候选数”前面的复选框来实现同样的功能。如下图所示:

如何利用候选数模式的标记操作解题

候选数有三种状态:不显示,标记删除,正常。

通常不显示的候选数,都是因为数独的三个基本规则而被直接排除掉的。

候选数还可以用鼠标右键点击来标记为删除或者正常两个状态。

当你使用获取提示,或者自动解题时,如果你已经在某个数格把一个候选数标记为删除状态,KLSudoku会认为该数格不存在该候选数。

KLSudoku的题目格式说明

KLSudoku支持9x9的数字矩阵格式,也支持81个字符长的单行题目格式,无数字数格可以使用0或者.代替皆可,KLSudoku会自动识别处理。

KLSudoku输出题目使用9x9格式。载入题目则9x9格式和81字符格式都可以。

9x9格式和81字符格式举例如下:

81字符格式:

.216.784.7...1...39.......23.......82.......7.9.....6...4...7.....2.1.......8....

9x9矩阵格式:

.216.784.
7...1...3
9.......2
3.......8
2.......7
.9.....6.
..4...7..
...2.1...
....8....

KLSudoku 可以随机生成题目,会在主程序目录下从lvl1.xml – lvl5.xml读取5个级别难度的题目来进行游戏,在安装KLSudoku时,已经默认携带了4万多道非常精简的题目,如果你不喜欢,可以将安装包附带 的这几个题库文件删除,则可以使用KLSudoku即时生成的最新的题目。

复制和粘贴

你可以在游戏进行时,从菜单或者工具栏进行复制和粘贴的操作。

  1. 你可以将正在游戏的题目的当前局面复制到剪贴板。

复制的格式为与当前局面一致9行9列的数字矩阵,其中没有填数的数格将以点号“.”代替。注意,复制当前局面的过程不检查当前局面是否正确,也就是说如果你手工解题过程中存在错误,那么复制出来的局面一样保留此错误,

  1. 你也可以选择将当前游戏的起始局面复制到剪贴板。
  2. 你也可以从其他软件或网站将数独题目粘贴到KLSudoku里进行游戏。

在解题过程中以及解题完成后,你还可以将解题过程复制到剪贴板。

KLSudoku会在解题过程里附上9x9格式以及81字符格式的题目。然后将解题过程逐步附上。

提示与自动解题

无论是在普通模式还是候选数模式,你都可以随时通过按CTRL-H或者从菜单选择,从工具栏按钮点击的方式来让KLSudoku给你一个当前最简单的解题提示。

KLSudoku会以颜色来标注与提示相关的数格和候选数,同时在状态条里会以文字方式显示推理过程。

如果你在寻求KLSudoku提示后,没有执行撤销操作,而是进行了其他解题操作,那么当前的提示会被自动执行。当你连续获取提示的时候,相当于让KLSudoku执行自动单步解题操作。

你也可以通过工具栏按钮让KLSudoku自动单步解题或者完全自动解题,但是需要注意的是,如果在之前你的手动解题过程如果存在错误则会遇到自动解题也无法完成的情况

撤销与重做操作

KLSudoku自动记录你解题的步骤,并且在这个基础上,提供了无限制的撤销与重做的功能。

当你觉得当前错误步骤存在问题的时候,你可以随时通过点击工具栏的单步撤销按钮撤销上一步操作。同样的,也可以通过点单步重做按钮将上一次的撤销操作撤销。

KLSudoku还通过校验解题步骤的正确与否,允许你将所有错误的步骤一次性全部撤销,确保当前的局面和解题步骤是正确的。在解题的时候,你可以通过“撤销全部错误”这个功能来随时校验自己的操作步骤是否正确有效。

KLSudoku的题目生成及难度划分

KLSudoku分了5级难度:容易,普通,困难,极难,骨灰

KLSudoku可以随机生成题目,同时也支持预置题库,预置题库为同目录下的lvl1.xml – lvl5.xml

常用解题技巧

普通模式下的基础技巧

直观法解题技巧是在普通游戏模式下最常用的技巧,复杂一点的谜题,可能需要自行填写候选数以采用进阶技巧来解题

单元唯一法( Sole Position Technique )

这应该算是直观法中最简单的方法了。基本上只需要看谜题,推理分析一概都用不上,这是因为要使用它所需满足的条件十分明显。同样,也正是因为它简单,所以只能处理很简单的谜题,或是在处理较复杂谜题的后期才用得上。

我们先来看在上图中的例子,观察行A,可以看到除了A5外,其他所有的单元格中都已有了数字,根据数独游戏的规则,即每行,列或区块中不能有重复的数字,则A5中能填入的数字只能是行A中所未出现过的,也就是数字7。所以可以毫不犹豫地在A5中填入7。

这就是单元唯一法在行中的应用。这里的单元(Unit, or group),指的是行,列或区块。所以有三种情况:

无论是哪种情况,我们都可以很快地在该行,列或区块剩余的空格中填入该单元还未出现过的数字。

同样,在上图中我们还可以看到单元唯一法在列和区块(宫)中的应用:

在第2列中,只有B2未填入数字,且这一列中数字5还未出现过。所以B2 = 5。

在区块(宫)中也是一样:

在起始于D1的区块中(左九宫),只有F3还未填入数字,且这个区块中数字9还未出现过,所以可以马上在F3中填入9。

单元唯一法在解题初期应用的几率并不高,而在解题后期,随着越来越多的单元格填上了数字,使得应用这一方法的条件也逐渐得以满足。

单元排除法( Basic Elimination Technique )

单元排除法是直观法中最常用的方法,也是在平常解决数独谜题时使用最频繁的方法。使用得当的话,甚至可以单独处理中等难度的谜题。

使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。

单元排除法对应于候选数法中的隐式唯一法。

那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,即行,列或区块中不能有重复的数字。从另一个角度来理解,就是

单纯理解上面的规则还是不足以解题,但是在实践中这些规则却可以交叉使用。在实际解题过程中,应用最多也最方便的是对区块的单元排除法。

我们可以先看下面这个例子:

对于起始于A4的区块(上九宫),我们可以利用行,列及区块的相互关系,即一个单元格既在某一行上,也同时在某一列上以及某一区块中的这种关系来解题。

  1. 观察数字5在谜题中的位置,可以看到它出现在A3,B8,D5,G6和H5。而这些位置中,只有A3,B8,G6和 D5与起始于A4的区块有关联。
  2. 因为B8=5,它所在的第B行上的其他单元格中不可能再出现5, 而区块中的B5和B6正好也在第B行上,所以这两个单元格填入5的可能性被排除。
  3. 同理,因为D5=5,它所在的第5列中的其他单元格不可能再填入5,而区块中的B5,C5也正好在第5列上,因此,B5,C5填入5的可能性也被排除掉了。
  4. 再看第6列,因为G6=5,所以该列上的 B6,C6也不可能再填入5,而这些单元格正好也在起始于A4的区块中。所以,这个起始A4的区块(上九宫)中能填入数字5的位置就只剩下了C4,这样就通过排除法找到了答案,即C4=5。

下面再看一个在行中使用单元排除法的例子:

  1. 在谜题中观察数字5和行G,在行G有6个空单元格无法确定数字,但是D5位置上的5使得其所在的第5列中的其他单元格上不能再出现5,所以G5不能填入5。
  2. H1上的5使得其所在的区块(左下九宫)中也不能再填入5,它帮助行G排除了三个单元格G1,G2和G3
  3. 而第8列上的B8中的数字5使得同样位于这一列上的G8也排除了填入5的可能。这样,行G中能填入5的位置就只剩下G6了。

在列中也可以使用单元排除法:

  1. 在第4列中,我们试图确定能填入数字1的位置。在行B中,数字1已经出现在B2上,所以B4不可能再填入数字1了。
  2. 而位于D5的数字1也使得D4,E4,F4排除了填入数字1的可能,因为它们位于同一区块中。
  3. 在H行中,由于H7的数字为1,所以H4也不可能为数字1。这样,第4列上就只有I4能填入数字1了。

通过上面的示例,可以看到,要对区块使用单元排除法,需要观察与该区块相交的行和列。要对行使用单元排除法,需要观察与该行相交的区块和列。要对列使用单元排除法,需要观察与该列相交的区块和行。

在 实际解题过程中,行,列和区块之间的关系并不象上面这些图中所示的那么明显,所以需要一定的眼力和细心观察。一般来说,先看哪个数字在谜题中出现得最多, 就从哪个数字开始下手,找到还未填入这个数字的单元(行,列或区块),利用已填入该数字的单元格与单元之间的关系,看能不能排除一些不可能填入该数字的位 置,直到剩下唯一的位置。如果害怕搞不清已经处理过哪些数字的话,可以从数字1开始,从左上角的区块开始一直检查到右下角的区块,看能不能在这些区块中应 用单元排除法。然后测试数字2,以此类推。

单元排除法是应用得最多的直观法,虽然在实践中经常会因为粗心而漏掉很多使用这一方法的机会,但只要勤加练习,就可以运用自如。

区块排除法( Block Elimination Technique )

区块排除法是直观法中进阶的技法。虽然它的应用范围不如单元排除法那样广泛,但用它可能找到用单元排除法无法找到的解。有时在遇到困难无法继续时,只要用一次区块排除法,接下去解题就会势如破竹了。

区 块排除法实际上是利用区块与行或列之间的关系来实现的,这一点与单元排除法颇为相似。然而,它实际上是一种模糊排除法,也就是说,它并不象单元排除法那样 利用谜题中现有的确定数字对行,列或区块进行排除,而是在不确定数字的具体位置的情况下进行排除的。这句话听起来似乎不好理解,让我们先从一个例子入手, 看看区块排除法是怎么应用的。

让 我们先来观察数字1,我们可以在C2,D5,I8看到有数字1,如何使用区块排除法呢?(这个例子可以使用其他方法来得出结论,但是我们先不考虑其他技 巧!) 让我们先观察一下左下九宫,由C2和I8的1,我们排除了G2,H2,I1,I2,I3五个数格里填写数字1的可能,但是依然还有G1,G3,H3三个数 格可以是数字1。如下图所示:

如 何从G1,G3,H3里找出正确的可以填写数字1的数格呢?我们注意到D5的数字1,排除了第D行其他数格填写数字1的可能。由于C2排除了第2列其他数 格填写数字1的可能,于是可以得出结论,在左九宫里,只有E3和F3可以填写数字1,而且数字1也必然存在于E3,F3里。于是我们可以根据下图所示再进 行一些排除推论:

由上图可以看到,E3,F3里必然有数字1,所以第3列其他数格不能再为数字1,也就是说G3,H3不可能为数字1。

至此我们可以得出结论,在左下九宫,只有G1可以填写数字1。

小结一下上面的求解方法:

解题时,实际上是在对目标区块(主区块)有影响的区块(辅助区块)中应用单元单元排除法,使辅助区块满足某些条件并能参与对主区块的数字排除。在上例中,左下九宫就是主区块,左九宫就是辅助区块。

实际应用中,可能出现下面四种情况:

  1. 当某数字在某个区块中可填入的位置正好都在同一行上,因为该区块中必须要有该数字,所以这一行中不在该区块内的单元格上将不能再出现该数字。
  2. 当某数字在某个区块中可填入的位置正好都在同一列上,因为该区块中必须要有该数字,所以这一列中不在该区块内的单元格上将不能再出现该数字。
  3. 当某数字在某行中可填入的位置正好都在同一区块上,因为该行中必须要有该数字,所以该区块中不在该行内的单元格上将不能再出现该数字。
  4. 当某数字在某列中可填入的位置正好都在同一区块上,因为该列中必须要有该数字,所以该区块中不在该列内的单元格上将不能再出现该数字。

其中1,2两种情况相对常见,也比较容易判断。

区块排除法也是一种非常常用的进阶技巧,有时候需要多个辅助区块才能得出最终推断。但是只要通过大量的练习,就可以很快掌握这一技巧。

唯一余数法( Sole Number Technique )

唯一余数法是直观法中较不常用的方法。虽然它很容易被理解,所以说明这个方法不需要很大篇辐,然而在实践中,却不易看出能够使用这个方法的条件是否得以满足,从而使这个方法的应用受到限制。

与单元唯一法相比,唯一余数法是确定某个单元格能填什么数的方法,而单元唯一法是确定某个数能填在哪个单元格的方法。另外,应用单元唯一法的条件十分简单,几乎一目了然。

与候选数法相比,唯一余数法相当于显式唯一法。虽然显式唯一法是候选数法中最简单且应用最容易的方法,但在直观法中却正好相反。

例如上图,G4数格可以使用唯一余数法得出结论,只能填写数字9。因为A4=1,G9=2,G2=3,D4=4,G3=5,F4=6,I5=7,G5=8,所以G4=9。

推论过程很好理解,但是在观察的时候,却很难注意到这点!

组合排除法( Combination Elimination Technique)

组合排除法和区块排除法一样,都是直观法中进阶的技法,但它的应用范围要更小一点。一般情况下,基本没有机会用到这种方法解题,所以要找到相应的例子也都很困难。当然,如果你希望优先以这个技法来解题的话,还是能碰到很多能符合使用组合排除法条件的情况。

组合排除法,顾名思义,要考虑到某种组合。这里的组合既包括区块与区块的组合,也包括单元格与单元格的组合,利用组合的关联与排斥的关系而进行某种排除。它也是一种模糊排除法,同样是在不确定数字的具体位置的情况下进行排除的。下面先看一个例子:

对于上面这个谜题,你能确定数字6在起始于G4的区块中的位置吗?

要想获得正确的答案初看起来有些困难。因为虽然在G9和H3已经存在了两个6,但是利用它们只能行排除区块中的G4和H6两个单元格,还是无法确定6到底是在I4还是在I5中。这时候,组合排除法就派上用场了。

现在撇开起始于G4的区块,先看它上面的两个区块,即起始于A4和D4的区块。这几个区块的共同特点是占有同样的几列,也就是第4列至第6列,因此它们之间的数字会相互直接影响。

对于起始于A4的区块,利用A1处已有的数字6进行行排除,可以得到这个区块中可能填入6的位置只剩下两个:B5和C6。对于起始于D4的区块,利用E7处已有的数字6进行行排除,可以得到这个区块中可能填入6的位置也剩下两个:F5和F6。

这时,我们仍无法确定6在这两个区块中的确切位置。但不妨对可能出现的情况作一下分析:

简 单地说,只有两种可能:B5=6且F6=6,或者C6=6且F5=6。决不会再出现其他的情况。但无论是其中哪一种情况,第5列和第6列都会有确定的6出 现在这两个区块中,也就是说,第5列和第6列的其他位置不可能再出现数字6。这样,原本无法肯定的6在起始于G4区块中的位置,一下子就变得明确了。

利用起始于A4和D4的区块对起始于G4的区块进行列排除,可以把I5排除掉,这样,就只剩下I4可以填入6了。

小结一下,组合排除法的要满足的条件如下:

矩形排除法( Rectangle Elimination Technique)

矩形排除法虽然浅显易懂,但一般在实际解题的时候应用得却比较少。这是因为即使谜题中存在满足使用这一方法的情况,也很难直接看出来。然而,相对组合排除法而言,在解题过程中倒是能有更多的机会用上矩形排除法。下面先看一个例子:

对 于这个谜题,如果不用矩形排除法是无法继续下去的。我们将通过讲解这种技法,从而找到数字8在起始于G1 的区块中的位置。乍看之下,好象一筹莫展。因为B2和E3上的8只能列排除左下角这个区块中的G2, H2,G3和I3这4个单元格,这时仍剩下两个单元格G1和H1无法确定。

让我们先来留意一下第6列,这一列中暂时没有8,那么8可能会填入哪几个单元格中呢?首先,B2中的8行排除了B6,而E3和F4中的8又分别行排除了E6和F6。这样,能填入8的位置就只剩下C6和I6了。见下图:

同样,对于第9列,由于F4的行排除,F9不可能填8,所以这一列能填入8的位置也就只剩下C9和I9了。

凑巧的是,这两列中能填入8的位置都在同样的两行上,即行C和行I。这时就为我们应用矩形排除法创造了前提条件。

如果第6列中C6=8,那么I6和C9一定不能是8。而第9列这时就只剩下I9能填入8了;

又或者如果第6列中I6=8,那么C6和I9一定不能是8,而第9列就只剩下C9能填入8了。

不可能再有第3种情况。所以,要么C6=8且I9=8,要么I6=8且C9=8。但无论是哪种情况,不难发现,行C和行I都已填入了8,所以这两行的其他位置不可能再填入8。我们正好可以利用这一点来进行排除。

观察起始于G1的区块,我们已经知道现在只剩下G1和I1两个单元格无法确定了,通过上面的分析,利用矩形排除法排除位于行I上的I1,就可以确定数字8一定在G1上。

总结一下,使用矩形排除法的条件如下:

矩形排除法可以说是直观法中最困难的技法,因为当前的谜题即使满足应用这一方法的条件,也实在太难发现了。一般情况下,尽量先使用其他相对简单的直观法。如果最后连矩形排除法都用上还是无法解题,你可能就需要尝试候选数法了。

候选数模式下的解题技巧

显式唯一数法(Naked Single)

这是候选数删减法中最简单的一种方法,就是扫描候选数栅格表,如果哪个单元格中只剩下一个候选数,就可应用显式唯一法,在该单元格中填入这个数字,并在相应行,列和区块的候选数中删除该数字。

单元格A1有唯一的候选数9,则毫无疑问地把数字9填入该单元格中,并扫描其所在行,列和区块的候选数中有无数字9:

如果有,则把9从这些单元格的候选数中删除:

显式唯一法虽然简单,但却是最有效的候选数删减法之一;尤其在谜题相对简单时,有时单单使用显式唯一法就可以解题。

在KLSudoku里,当在候选数模式下进行游戏的时候,如果你在一个数格填写了数字,那么KLSudoku会自动将数格所在行列宫的其他数格里的这个候选数进行排除。

隐式唯一数法(Hidden Single)

见文知义,隐式唯一法也是唯一候选数法的一种,但它肯定不如显式唯一法那样显而易见。我们知道,如果某一个单元格中只有一个候选数字,这时可以毫不犹豫地填入它;但是有没有这种情况,即使某个单元格中有不止一个候选数字,我们也可以轻易地推断出这个单元格的正确解答呢?

再看一看上面的题目:

在第A行中,单元格A7中虽然有多个候选数,但观察整列后我们发现,只有这个单元格中有数字3。根据数独游戏的规则,每一列中都必须要有从1到9的所有数字,而同时3却只能出现在这个单元格中,所以很显然A7=3。当然,别忘了把3从A7所在的列和区块中删除。

上图举的例子是在行里发现的隐式唯一数,类似的,隐式唯一数也可以出现在列和宫中。 因为隐式唯一数在游戏进行中不是很易于观察,所以也可以在游戏的时候结合直观法里的单元排除法来发现隐式唯一数。

隐式唯一法是显式唯一法的有力补充,很多稍复杂的题都可以在这两种方法的交替使用下得以解决。

区块删除法(Intersection Removal)

应 用显式唯一法和隐式唯一法只能解决简单的谜题,遇到稍复杂的谜题,还是要靠其他的方法。区块删减法也是比较常用的方法,它的目的是尽量删减候选数,而不一 定要生成某一单元格的唯一解(当然,产生唯一解更好)。区块删减法是利用区块中的候选数和行或列上的候选数之间的交互影响而实现的一种删减方法

下图是区块对列的影响:

可 以看到在起始于A7的区块中,数字9只出现在A9和C9的候选数中,更巧的是,A9和C9正好都在同一列上,即第9列。这时就可以应用区块删减法了。具体 地说,在起始于A7的区块中,数字9只能填在A9或是C9中,又因为这两个单元格都在第9列上,所以无论数字9 填在哪个单元格中,第9列的其他单元格中都不能再填数字9,所以要把9从它们的候选数中删除。在上图中,位于第9列的单元格E9中的候选数9将被删除。

下图说明的是区块对行的影响:

在起始于G1的区块中,只有H2和H3可以填入数字3,而这两个单元格正好都在行H中。同样的道理,在这个区块中无论数字3填入H2还是H3,行H中的其他单元格中都不可能再填入3,所以在单元格H4,H6和H7的候选数中的3将被删除。

下图说明的是列对区块的影响:

在 第5列中,8只出现在D5和F5的候选数中;也就是说,第5列中的数字8只能填入这两个单元格其中的一个。碰巧的是,这两个单元格正好都位于起始于D4的 区块中,结果使得这一区块中的数字8也不能填入区块的其他单元格中,所以D4,E4,E6和F6的候选数中的8将被删除。

同样,下图说明了行对区块的影响:

在行E中,只有E5和E6能填入数字6,而这两个单元格又刚好都在起始于D4的区块中,所以该区块中的其他单元格内不能再填入数字6,即6将从单元格D5和F5的候选数中删除。

总结一下区块删减法的条件,就是

显式数对法(Naked Pair)

显式数对法在很多谜题中都可以得到应用,它的条件比较容易满足,而且显而易见。

在 行E中,E2和E8中候选数只有两个,且都是2和3,即构成一个{2, 3}的数对。这使得该行中其他单元格中不能再出现2或3。为什么呢,因为假设E2=2,则E8一定要填3;反之,假设E2=3,则E8则一定填2,不会再 出现其他的情况。所以2和3必然不能成为该行中其他单元格的候选数。这样,E4,E5和E6的候选数中都不能再有2和3。

下面是显式数对法在列里的应用:

在第3列中,数对{6, 8}只出现且都出现在A3和H3中,所以其他单元格里都不能再有这两个数字。这样,C3的候选数中将删除6和8,而F3的候选数中将删除8。

同样,别忘了还有区块:

观察起始于G4的区块,可以发现G5和I4中含有数对{2, 4},这样,该区块中其他的单元格里都不能再有数字2和4,这次受影响的有4个单元格,分别是G4,H4,I5和I6。

总结一下显式数对的条件,也就是,在一个行,列或区块中,如果有两个单元格都包含且只包含相同的两个候选数,则这两个候选数字不能再出现在该行,列或区块的其他单元格的候选数中。

隐式数对法(Hidden Pair)

对 比显式数对法,隐式数对法也需要在同一行,列或区块中寻找两个单元格,而这两个单元格上都包含有一个数对(两个数字),且这个数对不会出现在该行,列或区 块的其他单元格上。然而,应用隐式数对法却要困难得多,因为它与显式数对法不同的是,包含有数对的单元格的候选数中可能还包含有其他的数字。

先看下图:

可 以看到,在行A中,数对{3, 6}只出现在A4和A8的候选数中,也就是说,数字3和6不可能再出现在该行的其他单元格中,这是因为这两个单元格中必然只能填入3和6,否则该行将缺少 这两个数字。这样,如果A4=3,则A8=6;反之,如果A4=6,则A8=3,不会再有其他的情况。所以我们可以放心地把其他的数字从这两个单元格的候 选数中删除。

下面是隐式数对在列中的例子:

在第1列中,数对{2, 9}只出现在G1和I1的候选数中,这样就符合了上面所述的隐式数对的条件,所以可以很安全地把其他数字从这两个单元格的候选数中删除,使这两个单元格中只保留了显式数对{2, 9}。

在区块中也是如此:

在起始于D4的区块中,数对{2, 8}只出现在E6和F6的候选数中,所以这两个单元格上其他的候选数将被删除,而只保留了数对{2, 8}。

总结一下,隐式数对的条件是,在同一行,列或区块中,如果一个数对(两个数字)正好只出现且都出现在两个单元格中,则这两个单元格的候选数中的其他数字可以被删除。

隐 式数对不象显式数对法那么容易发现,所以在解题时需要相对的耐心和细心。与显式数对法不同的是,隐式数对法只影响出现隐式数对的单元格,而不影响其所在 行,列或区块的其他单元格,这是因为这些其他的单元格中都不包含有这个数对。但通过隐式数对法删减了候选数后,隐式数对将转化为显式数对,可能会为其他的 行,列或区块应用各种候选数删减法创造条件。

显式三数集法(Naked Triplet)

显 式三数集法并不如显式数对法那样常见,但它们的原理却很相似。显式数对法要求同样的2个数字都出现在某行,列或区块的2个单元格中,且这2个单元格的候选 数不能包含其他的数字。同样,显式三数集法要求的是3个数字要出现在3个位于同一行,列或区块的单元格中,且这3个单元格的候选数中不能包含其他数字。但 不同的是,显式三数集法不要求每个单元格中都要包含这3个数字。例如,对于数字集{2,4,5},如果在某行,列或区块中有3个单元格的候选数分别为下面 几种情况时,都可应用显式三数集法,即3个单元格的候选数集可以分别为: {2, 4, 5} {2, 4, 5} {2, 4, 5},或 {2, 4} {4, 5} {2, 5},或 {2, 4, 5} {2, 5} {4, 5},或 {2, 4, 5} {4, 5} {2, 4, 5},或 ......

也就是说,要形成显式三数集,则必 须要有3个在同一行,列或区块中的单元格,每个单元格中至少要有2个候选数,且它们的所有候选数字也正好都是一个三数集的子集。由于这个三数集中的3个数 字正好可以分别填入这3个单元格中,所以该行,列或区块中其他的单元格中不可能再填入这3个数字。

但要注意的是,下面的这种情况不是显式三数集:

{2, 4, 5} {2, 4} {2, 4}

其中{2, 4}和{2, 4}可应用显式数对法,所以第一个候选数集{2, 4, 5}将只能剩下候选数5,这时就可应用显式唯一法了。

看下图:

在行D中,D1,D7和D8中分别包含候选数集{3, 5, 9},{3, 5, 9}和{5, 9},根据上面的知识,可以判断出这是一个显式三数集,因此数字3,5和9不可能再出现在行内其他的单元格中,所以D4和D6的候选数中的3,5和9将被删除。

下面是列中的显式三数集的例子:

在第2列中,G2,H2和I2中分别包含候选数集{2, 6},{2, 5}和{2, 5, 6},所以数字2,5和6只能在这三个单元格中分别填入,而不可能填入到该列的其他单元格中,因此A2,B2和E2的候选数中的2,5和6将被删除。

细心的朋友可能还发现,G2,H2和I2不仅都在第2列中,而且又恰好都在起始于G1的区块中,对于数字5,已经符合区块删减法的条件,可惜的是,第2列中其他单元格的候选数中都没有5可以删减。

同样,显式三数集还有在区块中的可能:

在起始于D7的区块中,D8],D9和E9中分别包含了候选数集{4, 9},{4, 8, 9}和{8, 9},这样区块中其他的单元格中不能再填入数字4,8和9,可以删减的单元格是E7和E8。

隐式三数集法(Hidden Triplet)

与 隐式数对法类似,这次需要3个数字和3个单元格。即当某个3个数字只出现在某行,列或区块的3个单元格中,且每个单元格中至少包含有其中的2个数字时,则 可以把其他数字从这3个单元格的候选数中删除。与显式三数集法类似,举例来说,对于三数集{2, 4, 5},如果某行,列或区块中的三个单元格的候选数集依次为以下情况时,都符合隐式三数集的条件: {2, 4, 5, 8} {1, 2, 4, 5} {2, 3, 4, 5, 9},或 {2, 4} {2, 3, 5} {4, 5, 7},或 {4, 5} {2, 5, 8} {1, 2, 3, 4, 5},或 {1, 2, 5} {2, 4, 8} {4, 5, 9},或 ......

具体分析先看下图:

在 行H中,三数集{5, 8, 9}中的任何数字都只出现在H1,H3和H5的候选数中,其中H1包含了数字5和9;H3包含了数字8和9;而H5中包含了数字 5和8。这说明数字5,8和9只能填入这三个单元格中,所以其他候选数不能出现在这三个单元格中。因此数字1和3将从H1的候选数中删除,而数字3和 4将从H3的候选数中删除。

需要说明一下的是,在上图中,使用显式四数集法显然比隐式三数集法要更容易发现。

下面是隐式三数集在列中的例子:

在第7列中,三数集{3, 7, 9}中的任何数字都只出现在F7,G7和H7的候选数中,其中F7包含了数字3和7;G7包含了数字3和9,而H7包含了数字3,7和9。这样,就符合了隐式三数集法的基本条件,不在这个三数集内的数字将从这三个单元格的候选数中删除。

隐式三数集还有可能发生在区块内。

隐式三数集法属于难度比较高的方法,在处理一般谜题时较少碰到。隐式三数集法只影响包含隐式三数集的三个单元格,与隐式数对法相似,删减的结果是把隐式三数集转换为显式三数集,并可能为使用其他的候选数删减法创造条件。

显式四数集法(Naked Quad)

显式四数集法比较少见,如果你已经对显式三数集法比较了解,则对显式四数集法也会很快掌握。

先 举个例子,对于数字集{1, 2, 4, 5},如果在某行,列或区块中有4个单元格的候选数分别为下面几种情况时,都可应用显式四数集法,即4个单元格的候选数集可以分别为: {1, 2, 4, 5} {1, 2, 4, 5} {1, 2, 4, 5} {1, 2, 4, 5},或 {1, 2, 4} {1, 4, 5} {2, 5} {1, 2},或 {1, 2, 4, 5} {2, 5} {2, 4, 5} {1, 2, 4, 5},或 {2, 5} {4, 5} {1, 2, 5} {1, 2, 4},或 {1, 2, 5} {1, 2, 4, 5} {1, 2, 4, 5} {2, 4},或 ......

这样的组合情况可以很多。也就是说,要形成显式四数 集,则必须要有4个在同一行,列或区块中的单元格,每个单元格中至少要有2个候选数,且它们的所有候选数字也正好都是一个四数集的子集。由于这个四数集中 的4个数字正好可以分别填入这4个单元格中,所以该行,列或区块中其他的单元格中不可能再填入这4个数字。

但要注意的是,下面的这种情况不是显式四数集:

{1, 2, 4, 5} {2, 4} {2, 5} {2, 4, 5}

其中{2, 4} {2, 5}和{2, 4, 5}可应用显式三数集法,所以第一个候选数集{1, 2, 4, 5}将只能剩下候选数1,这时就可应用显式唯一法了。

看下图:

很 明显,在行D中,D1,D4,D6和D8中分别包含了候选数集{3, 5, 6},{2, 5, 6},{2, 5, 6}和{3, 5, 6},即分别都是四数集{2, 3, 5, 6}的子集。这样在行D中,数字2,3,5和6就只能填入这4个单元格中,所以D3和D7的候选数中将不能包含这几个数字。

下面是显式四数集在列中的例子:

在 第9列中,C9,D9,E9和G9中分别包含了候选数集{1, 7, 8},{1, 8},{6, 7, 8}和{6, 7, 8},即分别都是四数集{1, 6, 7, 8}的子集。这样数字1,6,7和8就不能填入该列中除这四个单元格之外的单元格中,所以A9和B9的候选数中将不能出现这四个数字。

同样,显式四数集也可以出现在区块中:

在 起始于A7的区块中,B9,C7,C8和C9中分别包含了候选数集{6, 7},{1, 6, 8},{7, 8}和{1, 6, 7, 8},即它们分别都是四数集{1, 6, 7, 8}的子集。这样,数字1,6,7和8就不能填入该区块中除这四个单元格之外的单元格中,所以A7和A8的候选数中将不能出现这四个数字。

当然,掌握了显式四数集法,我们同样可以演绎出显式五数集法,显式六数集法等,但因为显式四数集法出现的几率已经较小,所以我们不指望推演出的更多方法能在解决数独谜题上带给我们有效的帮助。

隐式四数集法(Hidden Quad)

这 是一个极少用到的方法,因为它的条件比较难以满足。与隐式三数集法类似,这次需要4个数字和4个单元格。即当某个4个数字只出现在某行,列或区块的4个单 元格中,且每个单元格中至少包含有其中的2个数字时,则可以把其他数字从这4个单元格的候选数中删除。与显式四数集法类似,举例来说,对于四数集{1, 2, 4, 5},如果某行,列或区块中的四个单元格的候选数集依次为以下情况时,都符合隐式四数集的条件: {1, 2, 3, 4, 5} {1, 2, 4, 5, 8} {1, 2, 4, 5} {1, 2, 4, 5, 9},或 {1, 2, 4} {1, 5, 8} {2, 3, 5} {4, 5, 7},或 {4, 5} {1, 2, 4, 6} {2, 5, 8} {1, 2, 3, 4, 5},或 {1, 2, 3, 5} {1, 5} {2, 4, 8} {4, 5, 9},或 ......

象这样的组合可能会有很多。

具体分析先看下图:

在 行A中,四数集{2, 4, 8, 9}中的任何数字都只出现在A4,A6,A7和A8的候选数中,其中A4包含了数字2和4;A6包含了数字2,4和8;A7包含了数字4和9,而A8包含 了数字2,8和9。这样,就符合了隐式四数集法的基本条件,不在这个四数集内的数字将从这四个单元格的候选数中删除。

当 然,我们也可以看到,即使不用隐式四数集法,由于A3和A5形成了明显的显式数对,同样也可用显式数对法对该行其他单元格候选数的删减。这里,我们为了讲 解隐式四数集法,所以优先使用该方法。这也说明能应用这种方法的机会很少,因为经过很多较简单方法对候选数进行多番删减以后,已经较难满足隐式四数集的基 本条件。

同样,下面的谜题,我们本来可以用显式数对法来解决,但这里暂时优先使用隐式四数集法:

在 第6列中,四数集{1, 4, 8, 9}中的任何数字都只出现在A6,D6,E6和I6的候选数中,其中A6包含了数字1和4;D6包含了数字1,8和9;E6包含了数字4和9,而I6包含 了数字8和9。这样,就符合了隐式四数集法的基本条件,不在这个四数集内的数字将从这四个单元格的候选数中删除。

当然,在区块中也可应用隐式四数集法,因为鲜少有这样的例子,且与上面介绍的行与列中的隐式四数集类似,所以这里不再举例。

隐式四数集法只影响包含隐式四数集的四个单元格,与隐式数对法相似,删减的结果是把隐式四数集转换成显式四数集,并可能为使用其他的候选数删减法创造条件。这个方法一般在解决较为复杂的谜题时才有可能用到。

XY形态匹配法(XY-Wing)

XY-Wing也叫做Y-Wing,在sudopedia网站上可以看到Y-Wing的链接被重定向到XY-Wing的解说上了。

XY-Wing其实是一个涉及到了3个数格的短链,链里的数格只涉及到3个候选数,假设这三个候选数是X,Y,Z,中间数格的候选数为XY(所以叫做XY-Wing),两翼的数格则分别为XZ和YZ,中间数格可以在其行列宫里看到两翼的两个数格。

当观察到上面的XY-Wing的存在时,任何可以同时被XZ和YZ数格看到的数格里,都可以将候选数Z排除掉。

这是根据假设XZ或者YZ数格任意一个不为Z,就必然可以得出另外一个肯定为Z的推论来得出的。

尽管XY-Wing的原理就是这么简单,但是了解一下它的几种分类也有助于在解题时更方便的识别出XY-Wing。

第一种类型是 三个数格分布在两个宫里

这种类型里,XZ或者YZ其中之一与XY数格在同一个宫里,而另外一个则在其他宫里,与XY同行/列。这种类型的XY-Wing里XZ和YZ可以同时看到的数格有5个。例图:

推论如下: 假设D2为7,那么D8和E2显然不能为7。 假设D2不是7,那么D2就是4,则D7不是4,也就是D7为9,于是E8不为9,所以E8为7,所以D8和E2依然不能为7。同样的假设E8不为7,也可以得到D2为7。

第二种类型,则是三个数格在三个宫里

这种类型的XY-Wing里同时被XZ和YZ看到的只有一个数格。例图:

XY-Wing是一个非常常用的高级技巧,在实际解题中还是经常会需要用到的。

XYZ形态匹配法(XYZ-Wing)

XYZ-Wing是XY-Wing的一种延伸扩展技巧。在XYZ-Wing里,中间数格的候选数从两个变成了三个,也就是从XY变成了XYZ。并且在XYZ-Wing里,两翼的数格其中一个是与中间数格在同一个宫里的。 直接看下图例子吧:

上 图中D5是中间数格B5和D6是两翼数格,候选数6是z。 假设B5为6,那么可以直接退出F5不是6 假设B5不是6,那么B5是9,所以D5就不能是9,于是D5和D6就形成了7和6的数对,在D5和D6所在的宫里不可能再出现7和6,也就是F5依然不 能有6 由上面的叙述可以看出,无论B5是不是6,都可以得出F5是不可能为6的,所以F5的候选数6可以去除。

其他例图:

矩形对角线法(X-Wing)

X-Wing是一个高级技巧,在一些比较复杂的题目里可以非常有效的去除候选数。

如果一个数字正好出现且只出现在某两行的相同的两列上,则这个数字就可以从这两列上其他的单元格的候选数中删除。

当然,同样的情形也会出现在列中,也就是说,如果一个数字正好出现且只出现在某两列的相同的两行上,则这个数字就可以从这两行上的其他单元格的候选数中删除。

矩形对角线法不可能出现在区块中。

下图是横向的例子:

在行B和行G中,数字7都正好出现两次,且都位于第2列和第7列上;也就是说,在行B和行G中,数字7不是填入第2列,就是填入第7列。

而如果在行B中,B2=7,则对于行G,G2就不能是7,这是因为G2和B2在同一列上,这样G7就一定是7。

反之,如果在行B中,B7=7,则对于行G,G7就不能是7,7只能在G2。

简单地说,只可能有两种情况:B2=7且G7=7;或者B7=7且G2=7。

但无论是哪种情况,第2列和第7列中都肯定会出现数字7,所以这两列中其他的单元格中就不可能再有7。这样,就可以把7从其他的单元格的候选数中删除了,所以第2列中的A2以及第7列中的C7,D7和E7的候选数中将不会再有7。

下图则是列的例子:

可 以看到,在第1列和第7列上,数字9出现且只出现在行C和行G上,也就是说,在第1列中,要么C1=9,要么G1=9;而对于第7列,要么 C7=9,要么G7=9。而对于这两列只有两种情况,C1=9且G7=9;或者C7=9且G1=9。无论是上述哪种情况,行C和行G上都会有数字9出现, 则这两行上其他的单元格中不能再有9。所以行C上的C4和C5以及行G上的G2和G5候选数中的9将被删除。

三链数删减法(Sword Fish)

这个方法是X形态匹配法的一种扩展。这次要考虑的是3行和3列,而不是2行和2列。

先看下图:

观察数字9,在第C行,只在C5和C8出现,在第G行只在G1和G5出现,在第H行只在H1和H8出现。也就是说,对于数字9在C,G,H三行里,只在1,5,8列出现了。

现 在我们把数字9在这几行中所有可能的位置都列举出来: 假设G1不是9,则G5是9,所以C5不是9,于是C8是9,所以H8不是9,于是H1是9。可以看到,此时在1,5,8列都有9出 现:H1,G5,C8。 假设G1是9,则H1不是9,所以H8是9,于是C8不是9,所以C5是9,也得出G1,C5和H8是9,也就是1,5,8列都有9出现。 无论对C,G,H行里的的任意一个包含9的数格假设其是9或者不是9,都能得出这些数格在1,5,8三列一定会有数格为9,所以在1,5,8这三列上,不 在C,G,H的数格可以排除候选数9。

这样的推断看起来很麻烦,但是其实原理和X-Wing是一样的。总结一下,如果某个数字在某三行中只出现在相同的三列中,则这个数字也将从这三列上其他的候选数中删除。

同样,如果某个数字在某三列中只出现在相同的三行中,则这个数字将从这三行上其他的候选数中删除。例如:

四链数删减法(Jelly Fish)

JellyFish?是在SwordFish?的基础上再增加了一个数字,从对三行/三列的观察,变成了对四行/四列的观察。 下图是横向的JellyFish?

下图另外一个JellyFish?

唯一矩形排除法 Unique Rectangle(7种类型)

唯一矩形排除法,是利用了数独题目只有唯一解的规则来进行解题的。唯一矩形由两个关键候选数,四个数格来组成,并且四个数格要分布在两个宫里,并且形成一个矩形。具体可以看后面的例图就能明白。

在理解这些不同种类的唯一矩形排除法时,一定要牢牢记住:在唯一矩形的四个数格里,一定有非矩形候选数的数字存在。

UniqueRectangle1?

好,我们先看一下第一种类型:

上图中,候选数4和5在数格A4,A5和F4,F5形成了一个唯一矩形,并且这四个数格里,只有F4有一个额外候选数。由于唯一矩形的数格里必然要有一个填写不是4,5的数字,显然,F4应该填2。

UniqueRectangle2?

第一种类型中,只有一个数格有额外候选数,在第二种类型,则是有两个数格有额外候选数。如下图:

在 上图中候选数1和6在数格C8,C9,G8,G9形成了唯一矩形。根据数独解唯一的规则,可以知道在G8和G9两个数格中,一定有一个数格要填写不是1和 6的数字,而G8和G9的候选数里,不是1和6的只有5,也就是说G8和G9一定有一个要填写5,所以可以从G8和G9所在的HOUSE(也就是G行和右 下宫)里排除候选数5。所以G4和H8里的候选数5被去除掉了。

UniqueRectangle3?

在这第二种类型里,两个含有额外候选数(非形成唯一矩形的候选数)的两个数格恰好在矩形的同一个边,倘若这两个候选数不是在同一个边,而是在对角,则上面去除候选数的办法已经无法得出有意义的推断了。(当然这种情况还是有其他的办法来进行推论的)

如果两个数格里有两个不同的额外候选数,则我们还是可以利用唯一矩形法做一些推论,这种情形就属于第三种唯一矩形排除法了。我们看看第三种类型的例图:

候 选数5和7在B5,B6,G5,G6形成了一个唯一矩形,在G5和G6有额外的候选数2和6。所以我们可以知道,G5和G6里,2和6必然有一个要填写到 数格里。 这个时候我们可以吧G5和G6看做是一个有候选数2和6的伪数格,这个伪数格的house数格为G5和G6都可以看到的数格集合,在上图中,这个伪数格有 两个house,第一个是第G行,第二个是下九宫。 如何利用伪数格及其house进行解题呢?在这里我们利用到的是显式数集法,包括显式数对法,显式三数集法,至于隐式数集法以及其他的一些高级技巧也可以 组合进来考虑,但是那样的方法并不是很容易进行观察,所以我们先不考虑其他技巧。至于显式四数集法,在这种情形下并没有实际应用的机会,所以也不予考虑。 在上图中,在第G行并没有能找到同2和6这两个候选数形成显式数集的数格,但是在起始于G4的下九宫里,却能与H4和I4组成了{2,6,9}这个显示三 数集,于是我们可以从下九宫里G5,G6,H4,I4以外的数格排除候选数2,6,9。在上图的例子里,我们因此排除了I5填写数字2的可能!

UniqueRectangle4?

有 时候,对于只有两个数格有额外候选数的情形并不能套用第三种唯一矩形排除法,其中一种,还是有额外候选数的数格在对角线上的情况,另外一种更常见的情况 是,虽然额外候选数格在唯一矩形的同一条边上,但是并不能在这两个数格的共同house里找到显式数集。 对于这二种情况,我们可以再进行其他观察,倘若我们发现在这两个数格的共同house里,如果组成唯一矩形的其中一个候选数只出现了两次,这个时候我们可 以将另外一个组成唯一矩形的候选数从这两个有额外候选数的数格排除。也许这样说比较迷糊,我们还是以图例说明吧:

对 于上图里由候选数2和7在G5,G8,I5,I8组成的唯一矩形,乍一看并不能得到有效的推论,在I5和I8的共同HOUSE,也就是第I行里也并不能找 到4和8的数集。但是我们注意到一个事实,那就是组成唯一矩形的数字7,在第I行只出现了两次,也就是说I5的候选数7和I8的候选数7形成了强链。这个 时候我们可以得到下面的结论:

  1. 由于7在I行只出现了两次,所以在I5和I8里必然有一个是7
  2. 利用数独必须唯一解的特性,所以I5和I8里必然有4或者8
  3. I5和I8里必然是7和4,或者7和8,只有这两种情况,所以I5和I8肯定不会是2。

这就是第四中唯一矩形排除法了。

其他的例图:

UniqueRectangle5?

下 面看看第五种唯一矩形排除法。 第五种唯一矩形排除法其实跟第二种是很类似的,只不过将会有三个数格有一个相同的额外候选数。当出现这种情况时,可以从能被这三个有额外候选数的数格同时 看到的数格里排除这个额外的候选数。这种唯一矩形排除法应用的机会很少,下面是一个示例图:

B8,B9,F8和F9构成的唯一矩形里B8,B9和F8都包含有一个额外候选数6,所以从这三个数格都可以看到的A8排除了候选数6。

UniqueRectangle6?

第 六种矩形排除法里,有额外候选数的数格是在矩形的对角。如果我们可以进一步发现,当这两个有额外候选数的数格里其中一个非额外候选数为真可以推出对角的该 候选数为真,并且反方向推论也如此的时候,可以将这个候选数从这两个数格去除。因为上面的推论使得这个唯一矩形的数格里不能填写任意一个额外候选数! 这一段话有点晦涩难懂,先看个例图吧:

在 上图里,额外候选数2和7在I3和G5两个数格。由于形成矩形的候选数之一9在第G行和第I行是都只出现了两次。所以我们可以有如下推论: 1、 假设I3为9,则I3不是2,并且G3不是9,由于9在G行只出现两次,则G5是9,也即G5不是7,这显然与避免唯一矩形而退出I3和G5必然有一个不 能填写6和9的推论冲突。 2、 反过来,假设G5为9,则G5不是7,I5不是9,由于9在I行只出现两次,则I3是9,也即I3不是2,这显然同样是与避免唯一矩形的推论是矛盾的。 3、 综合上面两条,从I3和G5排除了候选数9。

在实际应用中,不但要观察矩形候选数在两行内是否都是强连接(即行内该候选数只出现两次),同样还可以观察两列的情况。并且还应该观察无额外候选数的两个数格的两条边是不是也有强链。这几种情况都是可以同样的得出上面的推导的。我们可以还是用上图举例:

候选数9在第3列和第5列是强连接(在这两列也都只出现了两次),所以即使如果9在G行和I行出现不止两次,我们也一样可以消除I3和G5的候选数9。

再比如,即使9在第3列和第G行出现不止两次,而在第I行和第5列都只出现了两次,也还是可以推断出I3和G5不能有9。

对于对角存在额外候选数的情况,我们可以总结一下:

  1. 唯一矩形的一个候选数如果在两条平行的边存在强链,则可以从有额外候选数的两个对角数格里抹除形成强链的候选数。
  2. 如果在矩形的边里,两个有额外数格的对角数格如果存在可以到达对方的某个矩形候选数的强连接,则也可以从这两个对角数格抹除形成强链的候选数。

其实说白了,还是那个基本的推论方法,那就是只要存在某个假设会使得这个矩形里未填写额外候选数,那么这个假设就是错误的。

在实际解题过程中,你甚至还可以组合应用一些其他手段,来检查是否存在导致两个额外唯一数被排除的情况,从而得到推论。

此外,还可以将这两个额外候选数视为存在强连接(因为一个不是,必然导致另外一个是),这点特性跟强连接在Chain(链)里的作用一样。

UniqueRectangle7?

这种类型的唯一矩形不太容易发现,因为涉及到的额外候选数和有额外候选数的数格较多,所以又被称为隐式唯一矩形排除法。但是这个技巧被应用的机会还是不少的。

假 设我们有一个A,B,C,D数格组成的矩形,A和D在对角,B和C在对角,且AB或BD在同一个BOX里,且他们各自的候选数满足这样的情况: A为ab,B为abx,C为aby,D为abz,其中x,y表示1个以上的候选数,z表示0个以上的候选数xyz可以存在相同的候选数。假定在B和D共同 的house里,候选数a只在B和D出现,C和D的共同的house里,a也只在C和D出现,这个时候我们就可以从D里排除候选数b

推理如下:

  1. 首先为了避免出现多解的情况,这四个方格中,一定会有一个非ab的候选数
  2. 假定D方格内的数字为b,则D方格不能是a,则B和C里的a因为与D的a是强连接,所以B和C里就一定是a,这就使得在A,B,C,D里不会出现非ab的情况,这显然与之前的推论矛盾,所以D方格不能有数字b。

下图是一个例子:

观 察上图,可以在行B行H和列8列9(即B8,B9,H8,H9)发现候选数3和4组成的唯一矩形,在这个例子里:A对应H9,B和C对应H8和B9,D则 对应了B8,候选数a为4,候选数b为3。其中候选数4在第8列和第B行分别只出现了两次,且H9只有4和3,于是我们可以从B8移除候选数3。

这是另几个例图:

X链解法(X-Chain)

X-Chain是一种非常重要的高级技巧,在解一些难题的时候,X-Chain是非常有用的。并且有一些特定的解题模式,其实就是X-Chain的一种特例,比如TurbotFish?就是X-Chain的一种特例解法。

什么是链,节点,强连接,弱连接?

要 解说X-Chain解法,首先要明白什么是Chain(链)。顾名思义,Chain是由一系列的节点来组成的,那么节点又是什么呢?在解数独题的时候,节 点可以使用三个元素来描述,即行、列和候选数,也就是说一个在某个数格里的候选数就是一个Chain里的节点,我们用“行列[数]”的格式来表达一个节 点,比如“A56?”表示的是第A行第5列的候选数6。

对于一个节点而言,它只有两个状态——真或者假,真表示节点上的候选数可被填写到其所在数格,为假则表示所在数格排除了该候选数。为真的时候,我们可以这样表达“A5=6”,为假的时候我们可以这样表达“A5!=6”

除了节点,还缺少一样关键的元素来形成链,那就是节点与节点之间的关系。我们使用强连接和弱连接来描述节点与节点之间的关系。

对 于强连接而言,当前一个几点为真,则下一个节点必然为假,并且如果前一个节点为假,下一个节点就必然为真(这在链的形成中是关键)。对于强连接代表的推导 符号,我们使用“=>”表达。 对于弱连接而言,只能有一个推断——当前一个节点为真时,下一个节点必然为假。对于弱连接代表的推导符号,我们使用“->”表达。

由 强连接和弱连接的定义可以很明白的看出,如果节点之间要形成可以进行推导的链,必须是一个强连接和弱连接交替组成的,这是因为当一个节点被假设为假的时 候,下一个节点必须与其形成强连接才可以继续进行推论。但是有一点必须要注意到的是,强连接同时也可以作为弱连接存在于链中,因为强连接也能满足弱连接的 定义——当前一个节点为真时,下一个节点必然为假。

通常情况下强链接意味着在同一个行/列/快里,只有两个数格包含有这个候选数,而弱连接则表示有三个或者三个以上的数格可以包含这个候选数。

还有另外一种情况也可以视为强连接和弱连接,那就是在同一个数格内,如果有两个候选数,则它们之间形成强连接,如果有三个及三个以上候选数,则这些候选数相互之间是弱连接。

什么是X-Chain

当我们对Chain里的节点做出各种限制和规定的时候,就可以得到多种不同的Chain。X-Chain就是其中一种。

在X-Chain解法的链里只涉及到一个候选数,也就是说,链里全部节点的候选数,都是同一个数!这同时也意味着,链里的所有节点不会出现在同一个数格里。

使用X-Chain,有时候可以让我们立即得出一个数格应该填什么数字的推断,有时候则是可以协助我们将某个候选数给排除掉。同时,有时候我们可以得出的推断也不止一个数格(根据形成的链持续推论)

让我们看看例图,如何使用X-Chain来进行推导:

上图是一个关于数字9的X-Chain,绿色箭头表示弱连接(有时候虽然两个数明显是强连接,但是在链里我们将其当作弱连接使用,比如B59?和C69?),红色箭头表示强连接。

使用之前对节点和连接,以及推导符号的说明,我们可以得到一个从G1开始的X-Chain: G19? => I29? -> I59? => B59? -> C69? => C39? ->B19? =>G19? 我们可以注意到,这个X-Chain形成了一个环,并且G19?既是一个强连接的开头,又是链里一个强链接的结尾,这显然会导致一个矛盾的推导!过程如下:

假设G1不是9,则G1!=9 => I2=9 ->I5!=9 => B5=9 -> C6!=9 => C3=9 ->B1!=9 =>G1=9。

这 样的推导出现了矛盾,所以假设是错误的,也就是说,G1就是应该填写9。得出这个结论后,依据这个X-Chain,我们可以得到一连串的推论,那就是 I1=7,B1=7,C3=9,C6=2,B5=9,I5=6等等。所以,虽然X-Chain在观察起来可能不是那么容易,但是在盘面上大部分数格的候选 数都已经明了的时候,还是一个非常实用的技巧的。

观察候选数以发现X-Chain

那么总结一下,在解题的时候如何观察以得到推断呢?假设我们正在搜索节点以加入到一个X-Chain链,当我们发现下一个要添加的节点已经添加过的时候,就有可能得到推断了:

  1. 假设当前节点是弱链尾,如果其与链里任意一个强链首有强连接,则该强链首的候选数就是正确的候选数(假设它不是会得出当前节点也不是!)
  2. 假设当前节点是强链尾,如果其与链里任意一个弱链首有连接(强弱均可),则弱链首节点的候选数排除(假设它为真会得到当前节点也真!)
  3. 对于当前节点是弱链尾,下一个节点是强链尾节点的情况,无法得出推断,则可以继续寻找别的节点加入X-Chain
  4. 对于当前节点是强链尾,下一个节点是弱链尾的情况,也无法得出推断。此时同样需要去寻找其他的节点加入X-Chain

如果我们用=>表示强链,->表示弱链,举个例子:

A => B -> C => D -> E => F ->G

对于第一种情况:如果G与A有强连接,则有这样的推断:

  1. 如果A为真,G为假(因为他们有强连接)
  2. 如果A为假,则B为真,C为假,D为真,E为假,F为真,得出G为假
  3. 无论A取值如何,G都为假,而G与A是强连接,所以A必然为真

而如果G与A无强连接的话,则不能得出上面的推论。因为当A为假,G为假在A与G只是弱连接的时候,是无法得出矛盾推论的。

对于第二种情况:如果H与G是强连接,H与B存在连接,则H是强链尾,B是弱链首,得出B不可能为真,推理过程如下:

假设B为真,则C为假,D为真,E为假,F为真,G为假,而G与H强连接,则H为真,而H与B存在连接,所以B要为假,这显然与起始假设矛盾

TurbotFish?解法

下面看一个更常用的X-Chain的特例,TurbotFish?解法:

TurbotFish?的观察判断方法:

在某两列上,某个候选数只出现了两次,并且在这两列上,这个候选数还有两个是在同一行上的,这个时候,可以被另外两个候选数看到的所有数格都可以去除这个候选数。

类似的,在行上也可以有TurbotFish?

在某两行上,某个候选数只出现了两次,并且在这两行上,这个候选数还有两个是在同一列上的,这个时候,可以被另外两个候选数看到的所有数格都可以去除这个候选数。

在寻找TurbotFish?的时候可以按上面的方法去观察,但是这个TurbotFish?是如何论证的呢?TurbotFish?其 实是“观察发现X-Chain”一节里提到的第二种情况,是X-Chain的最小化情形“强-弱-强”链,然后在链的首尾寻找可视节点(弱连接节点),并 且将可以被这个X-Chain的两端看到的节点排除这个候选数(因为此时这个X-Chain的一端为假,必然导致另外一端为真)。

以上图为例,我们可以使用X-Chain来进行论证:

G6=3 –> I4!=3 => D4=3 -> D9!=3 => G9=3 -> G6!=3 ,推论发生矛盾,所以G6不可以有候选数3。

使用类似推论过程,我们还可以排除I7和I8的候选数3!

XY链解法(XY-Chain)

XY-Chain也是一个非常重要的解题技巧,它同样是一种特殊的Chain,它也有一些特例,比如常用的Remote Pair解法。

XY-Chain与X-Chain相比有些怎样的区别呢?X-Chain只涉及到一个候选数,这个候选数以X代称之,所以叫X-Chain。类似的,XY-Chain之所以叫XY-Chain,是因为链是由只有两个候选数的数格组成。

根据上面的定义,我们可以注意到,在只有两个候选数的数格里,两个候选数之间形成强连接,所以与其他数格只要形成了弱连接,就可以应用强连接和弱连接的交替来实现推导。

如果在XY-Chain里,所有的数格的候选数都是同样的两个数,那么就是XY-Chain的特例——Remote Pair了。

此外还有一种特例,在我们之前的解法里已经讲述过了,那就是XY-Wing,XY-Wing是最短的XY-Chain,而XY-Wing都在同一个house里的时候,他们还表现为另外一种特例,那就是每个数格都只有两个候选数的显式三数集。

XY-Chain在实际应用中易于发现么?在候选数模式下,寻找出只有两个候选数数格,并在其中寻找可能的XY-Chain解法,还是相对容易观察和发现的,而RemotePair?和XY-Wing就更容易发现和应用了。让我们先看看下面这个普通的XY-Chain例子:

在上图里数格A1,A9,D9,D1形成了一个XY-Chain。链的两个端点是候选数9。我们可以注意到:

  1. 如果假设A1不是9,那么A1=7 -> A9!=7 => A9=6 ->D9!=6 =>D9=4 ->D1!=4=>D1=9。
  2. 同样的,如果假设D1不是9,也可以得出A1就是9。
  3. 综 合上面两个推论,可以肯定A1和D1必然有一个是9。所以我们可以推论得到所有被A1和D1看到的数格里都不可以再出现候选数9,就上图这个例子而言,第 1列里的A1和D1以外的数格都要将候选数9去除。也就是B1,C1,H1三个数格都可以根据这个XY-Chain的推断去除候选数9。

在观察X-Chain和XY-Chain,以及其他的Chain的时候,通常都可以用不同的标记来标记强弱链,这样就可以根据颜色来直接得出推断,而不必太过注重推理的过程。

比如在上图里A1和D1的候选数9,他们被以不同的颜色标注出来了(一个红色,一个绿色),这时你就可以直接推断他们两个肯定有一个是要填入的。

我们再来看看XY-Chain的特例,Remote Pair的实例:

在上图里,节点E3,A3,C2,C9形成的XY-Chain里,所有的数格都只包含了候选数2和7,所以这是一个RemotePair?解法。与前一个XY-Chain示例相类似的,我们可以从E3和C9共同看到的数格直接排除掉候选数2和7。也就是可以得出结论E9排除了7。

从上面的图还可以看出来,RemotePair?其实还是这两个候选数的两个X-Chain。其实RemotePair?表现得更像X-Chain或者XY-Wing一些的。

关连数删减法(Forcing-Chain)

Forcing-Chain是比X-Chain和XY-Chain还要更加普遍化的基于Chain的解题技巧。在实际运用中,只有极难的题才需要用到,并且Forcing-Chain在观察起来还是相当不容易的。

手动解题的时候,有时候花太多力气去寻找Forcing-Chain可能还不如猜测尝试的方法来得快和简单。然而理解了Forcing-Chain后,再去理解一些它的特例就会更加容易,可以从中总结出一些自己的经验技巧。

相比较X-Chain和XY-Chain,Forcing-Chain既不要求候选数唯一,也不要求数格里的候选数不超过两个。它唯一的也是必须的相同点就是它依然要靠强连接和弱连接交替连接来形成链。

我们先来看一个例图:

在上面这个图里里,我们可以观察到这样一个链:

G37? =>G77? -> E77? => E79? -> F79? => F49? -> F46? => E46? -> E36? => F36?

这个链还可以略做简化:

G37? =>G77? -> E77? => E79? -> F79? => F49? -> F46? => F36? (上面的链是因为程序逻辑的关系,到E4和E3数格兜了个圈)

从这个链,我们可以注意到,假设G3不是7,那么F3一定是6。因此我们可以得到一个矛盾推导,就是加入F3为7,那么就可以得出G3不是7,从而F3是6,这样的矛盾说明了F3不可能为7。

我们也可以这样理解:

  1. 假设G3不是7,那么F3一定是6,即F3不是7。
  2. 假设G3是7,由于F3和G3在同一列,存在弱连接,所以F3也不是7.
  3. 综合上面两个推论,F3肯定不是7。

在上图里,已经应用了关于强连接和弱连接的一个特殊情况,那就是在同一个数格内的候选数也可以形成强连接和弱连接。正是这个特性使得Forcing-Chain的解题能力很强,同时也使得Forcing-Chain非常的难以观察。

我们再看看下一个例图:

这个图就更加的让人难以观察了,KLSudoku虽然实现了Forcing-Chain的解法,但是并未过多的按照人的思路去寻找Forcing-Chain,所以看起来可能会觉得有点乱或者复杂,有时候还显得有点傻,呵呵,比如第一个Forcing-Chain的示例,_。不过这个并不重要,每个人在寻找Chain的时候习惯是各不一样的,所以KLSudoku主要是把这个解题过程展示出来,更多的还是要靠解题者去自行摸索。

KLSudoku附录信息

posted on 2009-03-24 00:01  ttylikl  阅读(1461)  评论(0编辑  收藏  举报