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里只有某个数格有某候选数时,那么此候选数就是该数格的唯一候选数 |
数独题有且只有一个解的特性,在一些解题的进阶技巧里也经常使用到。
普通模式即非候选数模式,在这种游戏模式下,在9 X 9的数格里,只会出现初始局面的数字以及用户自行填写的数字。你需要自行推断出某个数格应该填写什么数字,然后通过按键或鼠标直接填写。
在普通模式下,KLSudoku也提供了使用颜色标注数格和候选数来进行提示的辅助手段。在遇到困难局面时,可以使用提示来继续进行游戏。
可以使用鼠标点击的方式,或者通过键盘按键的方式对热点数格进行填数操作。要注意的是,如果你想要进行填数,并且所填的数字明显违反了1.2节游戏规则的时候,你的填数操作无效,可能不会有任何界面上的变化出现。
使用鼠标方式时,如同上图所示,可以通过点击9 X 9 的数格方阵上面表示列数的数字来改变默认的操作数字,当前的操作数字会以灰色背景和黑色数字来凸显出来。
在快捷标签弹窗里包含了填数和设置候选数两个选项卡,每个选项卡上都有数字0-9,如下图所示。
在普通模式下,对于一些其他的高级解题技巧,在获取提示的时候,KLSudoku会将相关的一些数格的候选数显示出来,以帮助你理解其推理过程。下图展示了区块排除法的推理过程:
需要说明的是,即使是在普通模式下,如果使用了提示,那么提示中涉及的关键数格的其余候选数也会被显示出来。例如在上图中,数格A8,A9,B8,C8,C9除了候选数7,其余可能的候选数也会被显示出来。
例如E4数格为数字7,所以在E行和4列,以及E4所在的中九宫里,所有的数格都不会有候选数7。候选数的这个自动显示是基于传统标准数独的三条基本游戏规则来实现的。
通常不显示的候选数,都是因为数独的三个基本规则而被直接排除掉的。
当你使用获取提示,或者自动解题时,如果你已经在某个数格把一个候选数标记为删除状态,KLSudoku会认为该数格不存在该候选数。
KLSudoku支持9x9的数字矩阵格式,也支持81个字符长的单行题目格式,无数字数格可以使用0或者.代替皆可,KLSudoku会自动识别处理。
KLSudoku输出题目使用9x9格式。载入题目则9x9格式和81字符格式都可以。
.216.784.7...1...39.......23.......82.......7.9.....6...4...7.....2.1.......8....
.216.784.
7...1...3
9.......2
3.......8
2.......7
.9.....6.
..4...7..
...2.1...
....8....
在解题过程中以及解题完成后,你还可以将解题过程复制到剪贴板。
KLSudoku会在解题过程里附上9x9格式以及81字符格式的题目。然后将解题过程逐步附上。
无论是在普通模式还是候选数模式,你都可以随时通过按CTRL-H或者从菜单选择,从工具栏按钮点击的方式来让KLSudoku给你一个当前最简单的解题提示。
KLSudoku会以颜色来标注与提示相关的数格和候选数,同时在状态条里会以文字方式显示推理过程。
如果你在寻求KLSudoku提示后,没有执行撤销操作,而是进行了其他解题操作,那么当前的提示会被自动执行。当你连续获取提示的时候,相当于让KLSudoku执行自动单步解题操作。
你也可以通过工具栏按钮让KLSudoku自动单步解题或者完全自动解题,但是需要注意的是,如果在之前你的手动解题过程如果存在错误则会遇到自动解题也无法完成的情况
KLSudoku自动记录你解题的步骤,并且在这个基础上,提供了无限制的撤销与重做的功能。
当你觉得当前错误步骤存在问题的时候,你可以随时通过点击工具栏的单步撤销按钮撤销上一步操作。同样的,也可以通过点单步重做按钮将上一次的撤销操作撤销。
KLSudoku可以随机生成题目,同时也支持预置题库,预置题库为同目录下的lvl1.xml – lvl5.xml
直观法解题技巧是在普通游戏模式下最常用的技巧,复杂一点的谜题,可能需要自行填写候选数以采用进阶技巧来解题
这就是单元唯一法在行中的应用。这里的单元(Unit, or group),指的是行,列或区块。所以有三种情况:
无论是哪种情况,我们都可以很快地在该行,列或区块剩余的空格中填入该单元还未出现过的数字。
同样,在上图中我们还可以看到单元唯一法在列和区块(宫)中的应用:
在第2列中,只有B2未填入数字,且这一列中数字5还未出现过。所以B2 = 5。
在起始于D1的区块中(左九宫),只有F3还未填入数字,且这个区块中数字9还未出现过,所以可以马上在F3中填入9。
单元唯一法在解题初期应用的几率并不高,而在解题后期,随着越来越多的单元格填上了数字,使得应用这一方法的条件也逐渐得以满足。
单元排除法是直观法中最常用的方法,也是在平常解决数独谜题时使用最频繁的方法。使用得当的话,甚至可以单独处理中等难度的谜题。
使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,即行,列或区块中不能有重复的数字。从另一个角度来理解,就是
单纯理解上面的规则还是不足以解题,但是在实践中这些规则却可以交叉使用。在实际解题过程中,应用最多也最方便的是对区块的单元排除法。
对于起始于A4的区块(上九宫),我们可以利用行,列及区块的相互关系,即一个单元格既在某一行上,也同时在某一列上以及某一区块中的这种关系来解题。
通过上面的示例,可以看到,要对区块使用单元排除法,需要观察与该区块相交的行和列。要对行使用单元排除法,需要观察与该行相交的区块和列。要对列使用单元排除法,需要观察与该列相交的区块和行。
单元排除法是应用得最多的直观法,虽然在实践中经常会因为粗心而漏掉很多使用这一方法的机会,但只要勤加练习,就可以运用自如。
区块排除法是直观法中进阶的技法。虽然它的应用范围不如单元排除法那样广泛,但用它可能找到用单元排除法无法找到的解。有时在遇到困难无法继续时,只要用一次区块排除法,接下去解题就会势如破竹了。
由上图可以看到,E3,F3里必然有数字1,所以第3列其他数格不能再为数字1,也就是说G3,H3不可能为数字1。
解题时,实际上是在对目标区块(主区块)有影响的区块(辅助区块)中应用单元单元排除法,使辅助区块满足某些条件并能参与对主区块的数字排除。在上例中,左下九宫就是主区块,左九宫就是辅助区块。
区块排除法也是一种非常常用的进阶技巧,有时候需要多个辅助区块才能得出最终推断。但是只要通过大量的练习,就可以很快掌握这一技巧。
唯一余数法是直观法中较不常用的方法。虽然它很容易被理解,所以说明这个方法不需要很大篇辐,然而在实践中,却不易看出能够使用这个方法的条件是否得以满足,从而使这个方法的应用受到限制。
与单元唯一法相比,唯一余数法是确定某个单元格能填什么数的方法,而单元唯一法是确定某个数能填在哪个单元格的方法。另外,应用单元唯一法的条件十分简单,几乎一目了然。
与候选数法相比,唯一余数法相当于显式唯一法。虽然显式唯一法是候选数法中最简单且应用最容易的方法,但在直观法中却正好相反。
例如上图,G4数格可以使用唯一余数法得出结论,只能填写数字9。因为A4=1,G9=2,G2=3,D4=4,G3=5,F4=6,I5=7,G5=8,所以G4=9。
对于上面这个谜题,你能确定数字6在起始于G4的区块中的位置吗?
要想获得正确的答案初看起来有些困难。因为虽然在G9和H3已经存在了两个6,但是利用它们只能行排除区块中的G4和H6两个单元格,还是无法确定6到底是在I4还是在I5中。这时候,组合排除法就派上用场了。
现在撇开起始于G4的区块,先看它上面的两个区块,即起始于A4和D4的区块。这几个区块的共同特点是占有同样的几列,也就是第4列至第6列,因此它们之间的数字会相互直接影响。
这时,我们仍无法确定6在这两个区块中的确切位置。但不妨对可能出现的情况作一下分析:
利用起始于A4和D4的区块对起始于G4的区块进行列排除,可以把I5排除掉,这样,就只剩下I4可以填入6了。
同样,对于第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上。
这是候选数删减法中最简单的一种方法,就是扫描候选数栅格表,如果哪个单元格中只剩下一个候选数,就可应用显式唯一法,在该单元格中填入这个数字,并在相应行,列和区块的候选数中删除该数字。
单元格A1有唯一的候选数9,则毫无疑问地把数字9填入该单元格中,并扫描其所在行,列和区块的候选数中有无数字9:
显式唯一法虽然简单,但却是最有效的候选数删减法之一;尤其在谜题相对简单时,有时单单使用显式唯一法就可以解题。
在KLSudoku里,当在候选数模式下进行游戏的时候,如果你在一个数格填写了数字,那么KLSudoku会自动将数格所在行列宫的其他数格里的这个候选数进行排除。
上图举的例子是在行里发现的隐式唯一数,类似的,隐式唯一数也可以出现在列和宫中。 因为隐式唯一数在游戏进行中不是很易于观察,所以也可以在游戏的时候结合直观法里的单元排除法来发现隐式唯一数。
隐式唯一法是显式唯一法的有力补充,很多稍复杂的题都可以在这两种方法的交替使用下得以解决。
在行E中,只有E5和E6能填入数字6,而这两个单元格又刚好都在起始于D4的区块中,所以该区块中的其他单元格内不能再填入数字6,即6将从单元格D5和F5的候选数中删除。
显式数对法在很多谜题中都可以得到应用,它的条件比较容易满足,而且显而易见。
在第3列中,数对{6, 8}只出现且都出现在A3和H3中,所以其他单元格里都不能再有这两个数字。这样,C3的候选数中将删除6和8,而F3的候选数中将删除8。
观察起始于G4的区块,可以发现G5和I4中含有数对{2, 4},这样,该区块中其他的单元格里都不能再有数字2和4,这次受影响的有4个单元格,分别是G4,H4,I5和I6。
总结一下显式数对的条件,也就是,在一个行,列或区块中,如果有两个单元格都包含且只包含相同的两个候选数,则这两个候选数字不能再出现在该行,列或区块的其他单元格的候选数中。
在第1列中,数对{2, 9}只出现在G1和I1的候选数中,这样就符合了上面所述的隐式数对的条件,所以可以很安全地把其他数字从这两个单元格的候选数中删除,使这两个单元格中只保留了显式数对{2, 9}。
在起始于D4的区块中,数对{2, 8}只出现在E6和F6的候选数中,所以这两个单元格上其他的候选数将被删除,而只保留了数对{2, 8}。
总结一下,隐式数对的条件是,在同一行,列或区块中,如果一个数对(两个数字)正好只出现且都出现在两个单元格中,则这两个单元格的候选数中的其他数字可以被删除。
其中{2, 4}和{2, 4}可应用显式数对法,所以第一个候选数集{2, 4, 5}将只能剩下候选数5,这时就可应用显式唯一法了。
细心的朋友可能还发现,G2,H2和I2不仅都在第2列中,而且又恰好都在起始于G1的区块中,对于数字5,已经符合区块删减法的条件,可惜的是,第2列中其他单元格的候选数中都没有5可以删减。
在起始于D7的区块中,D8],D9和E9中分别包含了候选数集{4, 9},{4, 8, 9}和{8, 9},这样区块中其他的单元格中不能再填入数字4,8和9,可以删减的单元格是E7和E8。
需要说明一下的是,在上图中,使用显式四数集法显然比隐式三数集法要更容易发现。
显式四数集法比较少见,如果你已经对显式三数集法比较了解,则对显式四数集法也会很快掌握。
{1, 2, 4, 5} {2, 4} {2, 5} {2, 4, 5}
其中{2, 4} {2, 5}和{2, 4, 5}可应用显式三数集法,所以第一个候选数集{1, 2, 4, 5}将只能剩下候选数1,这时就可应用显式唯一法了。
当然,掌握了显式四数集法,我们同样可以演绎出显式五数集法,显式六数集法等,但因为显式四数集法出现的几率已经较小,所以我们不指望推演出的更多方法能在解决数独谜题上带给我们有效的帮助。
同样,下面的谜题,我们本来可以用显式数对法来解决,但这里暂时优先使用隐式四数集法:
当然,在区块中也可应用隐式四数集法,因为鲜少有这样的例子,且与上面介绍的行与列中的隐式四数集类似,所以这里不再举例。
隐式四数集法只影响包含隐式四数集的四个单元格,与隐式数对法相似,删减的结果是把隐式四数集转换成显式四数集,并可能为使用其他的候选数删减法创造条件。这个方法一般在解决较为复杂的谜题时才有可能用到。
XY-Wing也叫做Y-Wing,在sudopedia网站上可以看到Y-Wing的链接被重定向到XY-Wing的解说上了。
当观察到上面的XY-Wing的存在时,任何可以同时被XZ和YZ数格看到的数格里,都可以将候选数Z排除掉。
这是根据假设XZ或者YZ数格任意一个不为Z,就必然可以得出另外一个肯定为Z的推论来得出的。
尽管XY-Wing的原理就是这么简单,但是了解一下它的几种分类也有助于在解题时更方便的识别出XY-Wing。
这种类型里,XZ或者YZ其中之一与XY数格在同一个宫里,而另外一个则在其他宫里,与XY同行/列。这种类型的XY-Wing里XZ和YZ可以同时看到的数格有5个。例图:
这种类型的XY-Wing里同时被XZ和YZ看到的只有一个数格。例图:
XY-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。
这个方法是X形态匹配法的一种扩展。这次要考虑的是3行和3列,而不是2行和2列。
观察数字9,在第C行,只在C5和C8出现,在第G行只在G1和G5出现,在第H行只在H1和H8出现。也就是说,对于数字9在C,G,H三行里,只在1,5,8列出现了。
这样的推断看起来很麻烦,但是其实原理和X-Wing是一样的。总结一下,如果某个数字在某三行中只出现在相同的三列中,则这个数字也将从这三列上其他的候选数中删除。
同样,如果某个数字在某三列中只出现在相同的三行中,则这个数字将从这三行上其他的候选数中删除。例如:
JellyFish?是在SwordFish?的基础上再增加了一个数字,从对三行/三列的观察,变成了对四行/四列的观察。 下图是横向的JellyFish? :
下图另外一个JellyFish? :
唯一矩形排除法,是利用了数独题目只有唯一解的规则来进行解题的。唯一矩形由两个关键候选数,四个数格来组成,并且四个数格要分布在两个宫里,并且形成一个矩形。具体可以看后面的例图就能明白。
在理解这些不同种类的唯一矩形排除法时,一定要牢牢记住:在唯一矩形的四个数格里,一定有非矩形候选数的数字存在。
好,我们先看一下第一种类型:
上图中,候选数4和5在数格A4,A5和F4,F5形成了一个唯一矩形,并且这四个数格里,只有F4有一个额外候选数。由于唯一矩形的数格里必然要有一个填写不是4,5的数字,显然,F4应该填2。
第一种类型中,只有一个数格有额外候选数,在第二种类型,则是有两个数格有额外候选数。如下图:
在 上图中候选数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被去除掉了。
在这第二种类型里,两个含有额外候选数(非形成唯一矩形的候选数)的两个数格恰好在矩形的同一个边,倘若这两个候选数不是在同一个边,而是在对角,则上面去除候选数的办法已经无法得出有意义的推断了。(当然这种情况还是有其他的办法来进行推论的)
如果两个数格里有两个不同的额外候选数,则我们还是可以利用唯一矩形法做一些推论,这种情形就属于第三种唯一矩形排除法了。我们看看第三种类型的例图:
候 选数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的可能!
有 时候,对于只有两个数格有额外候选数的情形并不能套用第三种唯一矩形排除法,其中一种,还是有额外候选数的数格在对角线上的情况,另外一种更常见的情况 是,虽然额外候选数格在唯一矩形的同一条边上,但是并不能在这两个数格的共同house里找到显式数集。 对于这二种情况,我们可以再进行其他观察,倘若我们发现在这两个数格的共同house里,如果组成唯一矩形的其中一个候选数只出现了两次,这个时候我们可 以将另外一个组成唯一矩形的候选数从这两个有额外候选数的数格排除。也许这样说比较迷糊,我们还是以图例说明吧:
对 于上图里由候选数2和7在G5,G8,I5,I8组成的唯一矩形,乍一看并不能得到有效的推论,在I5和I8的共同HOUSE,也就是第I行里也并不能找 到4和8的数集。但是我们注意到一个事实,那就是组成唯一矩形的数字7,在第I行只出现了两次,也就是说I5的候选数7和I8的候选数7形成了强链。这个 时候我们可以得到下面的结论:
这就是第四中唯一矩形排除法了。
其他的例图:
下 面看看第五种唯一矩形排除法。 第五种唯一矩形排除法其实跟第二种是很类似的,只不过将会有三个数格有一个相同的额外候选数。当出现这种情况时,可以从能被这三个有额外候选数的数格同时 看到的数格里排除这个额外的候选数。这种唯一矩形排除法应用的机会很少,下面是一个示例图:
B8,B9,F8和F9构成的唯一矩形里B8,B9和F8都包含有一个额外候选数6,所以从这三个数格都可以看到的A8排除了候选数6。
第 六种矩形排除法里,有额外候选数的数格是在矩形的对角。如果我们可以进一步发现,当这两个有额外候选数的数格里其中一个非额外候选数为真可以推出对角的该 候选数为真,并且反方向推论也如此的时候,可以将这个候选数从这两个数格去除。因为上面的推论使得这个唯一矩形的数格里不能填写任意一个额外候选数! 这一段话有点晦涩难懂,先看个例图吧:
在 上图里,额外候选数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。
对于对角存在额外候选数的情况,我们可以总结一下:
其实说白了,还是那个基本的推论方法,那就是只要存在某个假设会使得这个矩形里未填写额外候选数,那么这个假设就是错误的。
在实际解题过程中,你甚至还可以组合应用一些其他手段,来检查是否存在导致两个额外唯一数被排除的情况,从而得到推论。
此外,还可以将这两个额外候选数视为存在强连接(因为一个不是,必然导致另外一个是),这点特性跟强连接在Chain(链)里的作用一样。
这种类型的唯一矩形不太容易发现,因为涉及到的额外候选数和有额外候选数的数格较多,所以又被称为隐式唯一矩形排除法。但是这个技巧被应用的机会还是不少的。
假 设我们有一个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
推理如下:
下图是一个例子:
观 察上图,可以在行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-Chain是一种非常重要的高级技巧,在解一些难题的时候,X-Chain是非常有用的。并且有一些特定的解题模式,其实就是X-Chain的一种特例,比如TurbotFish?就是X-Chain的一种特例解法。
要 解说X-Chain解法,首先要明白什么是Chain(链)。顾名思义,Chain是由一系列的节点来组成的,那么节点又是什么呢?在解数独题的时候,节 点可以使用三个元素来描述,即行、列和候选数,也就是说一个在某个数格里的候选数就是一个Chain里的节点,我们用“行列[数]”的格式来表达一个节 点,比如“A56?”表示的是第A行第5列的候选数6。
对于一个节点而言,它只有两个状态——真或者假,真表示节点上的候选数可被填写到其所在数格,为假则表示所在数格排除了该候选数。为真的时候,我们可以这样表达“A5=6”,为假的时候我们可以这样表达“A5!=6”
除了节点,还缺少一样关键的元素来形成链,那就是节点与节点之间的关系。我们使用强连接和弱连接来描述节点与节点之间的关系。
对 于强连接而言,当前一个几点为真,则下一个节点必然为假,并且如果前一个节点为假,下一个节点就必然为真(这在链的形成中是关键)。对于强连接代表的推导 符号,我们使用“=>”表达。 对于弱连接而言,只能有一个推断——当前一个节点为真时,下一个节点必然为假。对于弱连接代表的推导符号,我们使用“->”表达。
由 强连接和弱连接的定义可以很明白的看出,如果节点之间要形成可以进行推导的链,必须是一个强连接和弱连接交替组成的,这是因为当一个节点被假设为假的时 候,下一个节点必须与其形成强连接才可以继续进行推论。但是有一点必须要注意到的是,强连接同时也可以作为弱连接存在于链中,因为强连接也能满足弱连接的 定义——当前一个节点为真时,下一个节点必然为假。
通常情况下强链接意味着在同一个行/列/快里,只有两个数格包含有这个候选数,而弱连接则表示有三个或者三个以上的数格可以包含这个候选数。
还有另外一种情况也可以视为强连接和弱连接,那就是在同一个数格内,如果有两个候选数,则它们之间形成强连接,如果有三个及三个以上候选数,则这些候选数相互之间是弱连接。
当我们对Chain里的节点做出各种限制和规定的时候,就可以得到多种不同的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链,当我们发现下一个要添加的节点已经添加过的时候,就有可能得到推断了:
A => B -> C => D -> E => F ->G
而如果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要为假,这显然与起始假设矛盾
下面看一个更常用的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-Chain也是一个非常重要的解题技巧,它同样是一种特殊的Chain,它也有一些特例,比如常用的Remote Pair解法。
根据上面的定义,我们可以注意到,在只有两个候选数的数格里,两个候选数之间形成强连接,所以与其他数格只要形成了弱连接,就可以应用强连接和弱连接的交替来实现推导。
如果在XY-Chain里,所有的数格的候选数都是同样的两个数,那么就是XY-Chain的特例——Remote Pair了。
XY-Chain在实际应用中易于发现么?在候选数模式下,寻找出只有两个候选数数格,并在其中寻找可能的XY-Chain解法,还是相对容易观察和发现的,而RemotePair?和XY-Wing就更容易发现和应用了。让我们先看看下面这个普通的XY-Chain例子:
在上图里数格A1,A9,D9,D1形成了一个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是比X-Chain和XY-Chain还要更加普遍化的基于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。
我们也可以这样理解:
在上图里,已经应用了关于强连接和弱连接的一个特殊情况,那就是在同一个数格内的候选数也可以形成强连接和弱连接。正是这个特性使得Forcing-Chain的解题能力很强,同时也使得Forcing-Chain非常的难以观察。
我们再看看下一个例图:
这个图就更加的让人难以观察了,KLSudoku虽然实现了Forcing-Chain的解法,但是并未过多的按照人的思路去寻找Forcing-Chain,所以看起来可能会觉得有点乱或者复杂,有时候还显得有点傻,呵呵,比如第一个Forcing-Chain的示例,_。不过这个并不重要,每个人在寻找Chain的时候习惯是各不一样的,所以KLSudoku主要是把这个解题过程展示出来,更多的还是要靠解题者去自行摸索。