【前言】作为零基础入手攻克专家级数独难题的实战案例,本文首先介绍数独填数所需要用到的专有名词,以使初学者在阅读本文实战案例时不致产生误解,这些名词解释,部分借鉴了正规书籍,其中有部分也添加了本人自己的解释;而本文所介绍的实战案例,则是属于本人原创,其中较少运用各种复杂的删数技巧,取而代之以通过逻辑清晰的求解链试数方法。本文目的就是让每一个数独爱好者包括初学者都能快速学会专家级数独难题的思路。适度关注出数技巧、更加注重试数逻辑是本人实战操作的一大特点。本人根据该数独方法在三天内解答出了芬兰数学家Arto Inkala花费三个月做出的号称史上最难的数独表。希望对数独有兴趣的各位老师朋友能够留言交流讨论,对于指望培养孩子逻辑思维能力的家长,本人介绍的数独方法特别有利于孩子循序渐进,在最短的时间内学会解答骨灰级乃至专家级数独难题。

1、数独名词

数独:填数结构盘面共有9 X 9 = 81个单元格,在每一单元格内填入1到9当中一个数字,使得最终每行、列、宫内都不含有重复数字的一种填数游戏;

行:数独盘面每一横排,本文用字母A、B、C、D、E、F、G、H、I标记各行;

列:数独盘面每一竖排,本文用数字1、2、3、4、5、6、7、8、9标记各列;

单元格:指数独盘面每一个小格子,用小格子所在行和列的标签组合表示,如第C行和第3列交叉处的单元格格用C3标记;

宫:数独盘面分为左上区(A1:C3)、中上区(A4:C6)、右上区(A7:C9)、左中区(D1:F3)、中中区(D4:F6)、中右区(D7:F9)、左下区(G1:I3)、中下区(G4:I6)、右下区(G7:I9)这九个小区块,各单元格由其所在位置分属不同的宫,例如B2和所有(A1:C3)区域的单元格都属于左上区的宫;

初盘:数独最开始的题目盘面;

提示数:数独初盘下给定的用来进行推理的原始数字,也叫已知数;

候选数:每一个单元格的所有填数可能,也叫暗头。标记方法:A3单元格含有1、2和5三个候选数则标记为A3(1、2、5);

候选数盘:数独给出了全盘候选数状况下的盘面,也叫铅笔盘;

单值格:指每个已经有明数的单元格,明数既可以是提示数,也可以是经过技巧得到的填数;

双值格:数独盘内有两个候选数的单元格;

多值格:数独盘内有多个候选数的单元格;

终盘:是指每个单元格都填数完成并满足数独规则的答案盘;

出数:由技巧所得的填数结论;

删数:由技巧所得删除数字结论;

步:做题的每一个出数和删数的结论;

摒除:利用数字在同一行、列和宫内不得重复的情况,进而进行排除的一种逻辑;

试数:当数独盘面不能直接删数和出数时,通过在特定单元格内试填该单元格的候选数,如果最终得到矛盾就排除当前填数,否则就进行下一轮出数、删数或试数的方法;

求解链:求解过程中利用强关系和弱关系来证明数字结论的过程,特别是应用于双分支或者多分支试数的情况,以使逻辑清晰,思路明确;

链头:推理过程开头的节点;

链尾:推理过程链的末端;

双分支试数法:以数独候选数盘某个双值格作为节点,开始向下填数并试数,直至得出矛盾或者答案的方法;

多分支试数法:数独的候选数盘没有双值格时选择以某个多值格作为根节点,开始向下填数并试数,直至得出矛盾或者答案的方法;

2、行、列、宫删数判别式

2-1、整行(或列、宫)中目标单元格总数 < 目标单元格候选数总数,则该行(或列、宫)可以重新选择目标单元格范围;

2-2、整行(或列、宫)中目标单元格总数 = 目标单元格候选数总数,则目标单元格的候选数可以用来对该行(或列、宫)其他单元格进行删数操作;

例:下图中同属于左上宫(A1:C3)的A2和B2单元格数两个,它们的共有候选数是2、6,共有候选数等于单元格数,因而可以用来对同宫的A3(2、3、6)、B3(2、4、5)执行删数操作;

2-3、整行(或列、宫)中目标单元格总数 > 目标单元格候选数总数,则该数独表必定出现重值,则该推理链可以摒除,相对应的节点出现错值(False)。

例:下图同宫的5个单元格A2、A3、B1、B3、C1共有候选数只有4个:2、3、6、7,因而该数独表最终必定会出现重值。

这跟多元一次方程组判别变量有多个解、唯一解和无解的规则有异曲同工之妙。

3、数独求解过程

数独求解过程,就是不断利用技巧删数、填数以及试数得到正确答案的过程。

3-1、删数

3-1-1、对于新出现的单值格,按照和提示数同样的办法进行该单元格所在的行、列、宫进行删数操作;

例:单元格I3=5可以对同为第I行的单元格I9(2、5)删数,同时可以同为第3列的B3(5、8)删数,还可以对同宫的G1(1、2、5、7、9)及G3(1、5、8、9)删数。

3-1-2、如果整行(或列、宫)出现几个单元格的个数等于其共同候选数个数的情况,则这几个单元格所在行(或列、宫)中其它单元格可以从各自候选数中删除上述共同候选数;

例:下图中目标单元格B5和B7个数为2,共同有2个候选数4、8,因而可以对同为B行的B9(2、4、8)执行删数;而G3(8、9)和H3(8、9)既是同列数又是同宫数,它们单元格个数和候选数个数都是2,因而可以对同宫数G1(2、5、9)、G2(2、4、7、8)、H1(2、9)、H2(2、4、7、8)删数,还能对同列的A3(3、6、8)及F3(3、6、9)删数。

3-2、填数

3-2-1、通过删数完成后在某个单元格自动出现单值格;

3-2-2、唯一候选数法:即当整行(或列、宫)中某个候选数只出现在某个单元格中,虽然这个单元格可能还存在其候它选数,也直接填数这个数;

例:下图中A4(2、9)候选数在整个A行是唯一的,因而A4可以直接填数2,否则缺失数字将有违数独规则。

3-3、试数

当数独表不能通过删数或者填数进行下一步操作,或者删数以及填数的技巧太强不易掌握时,就可考虑通过试数来进行求解。试数并非盲目试数,要想做到事半功倍,需要遵循下述原则:

3-3-1、要选择候选数少的单元格作为试数起始点,例如双值格和多值格同时存在的情况下,要优先考虑双值格,以尽可能减少分支链的并列分支数量以减少复杂程度,同时也可以尽快得到新的单值格以进行删数操作。

例:下图双值格B(2、9)仅有两个候选数2、9,而D4(4、5、9)有三个候选数4、5、9,选择D4节点就意味着求解链的链头只有两个分支,这可以大大简化求解链分支复杂程度。

3-3-2、存在多个双值格时,要通过观察或者简单演算,优先选择试数时能够出现较多新的单值格作为求解链的新的起始节点;

例:比较下图中A4(2、9)、H3(8、9),如果以A4(2、9)作为节点,当A4=2,删数不能直接产生新的单值格,从而不能为下一步删数做准备,而当A4=9时,删数同样不能直接产生新的单值格;而如果以I3(1、5)为起始节点,当I3=1时,则I7=7,I5=2、I9=5,先后直接出现至少4个单值格,从而为下一步删数做好准备;而当I3=5时,则I9=2、I5=7、I5=1、B3=8共5个单值格,单值格越多,那么下一步删数就越顺利。

这一步非常重要,在非常复杂的数独表中可以大大提高工作效率,而很多人可能没有注意到这一点!

4、本数独表难度

本数独表包含24个提示数,HoDoKu v2.2难度评分8994,Sudoku Explainer v1.2.9难度评分8.5分,属于专家级难度级别。作为对照,芬兰数学家Arto Inkala花费三个月做出的号称史上最难的数独表,HoDoKu v2.2难度评分21342,Sudoku Explainer v1.2.9难度评分10.7分,作者通过本文介绍的数独实战方法只用三天时间同样求出了正确答案。

5、本数独表实战过程

5-1、原数独表

5-2、将数独表转化成候选数盘

将原数独表中的提示数按各自所在的单元格所在的行、列、宫进行删数操作,得到如下候选数盘。

5-3、选择双值格I3(1、5)作为求解链的链头

选择I3作为试数起始单元格的原因,可以参考本文2-3-1和2-3-2的试数原则。

5-4、首先令I3=5进行试数

5-4-1、数独表先后进行B3=8、B9=4、B7=7、B1=5、B5=2、A4=9、H3=9、H5=6、H9=8、H8=7、H1=2、H2=4、G3=1、G1=7等单元格所在行、列、宫删数操作;

5-4-2、G行G8(5、6)和G9(5、6)候选参数都是5和6,和其同行的G7(4、6)可删除候选参数6直接得到G7=4;

5-4-3、A行A3和A9候选数都为3和6,可以分别以3和6对该行的A2和A8进行删数操作,A行A3和A9候选数都为3和6,可以分别以3和6对该行的A2和A8进行删数操作,A2=1而A8候选参数变为2和8,记作A8(2、8);

5-4-4、数独表先后进行A2=1、A5=8、C1=6、C6=1、A3=3、A9=6、E2=3、G9=5、E9=9、E1=1、E5=5等各单元格所在行、列、宫删数操作;

5-4-5、F行F3=F4=6出现相同数值与数独规则相矛盾,导致该推理链以I3=5的节点的结果出现假值(False),单元格I3=5的节点需要删除。

5-5、令I3=1试数:

5-5-1、数独表先后进行I3=1、I5=2、I9=5删数操作,得到以下图表,注意完成删数操作后新的明数I3、I7、I5和I9都突出标记显示出来;

5-6、令B3=8试数:

B3=8作为I3=1节点向下的新的节点;

5-6-1、数独表先后由单元格B3=8、B7=4、B9=2、B5=5、B1=7、H3=9、G3=5进行删数操作;

5-6-2、数独表第1列单元格G1=H1=2出现数值重复,与数独规则不符,故在I3=1节点下B3=8的分支节点需要舍去;

5-7、B3=8途径被摒弃,转而令B3=5试数:

5-7-1、数独表先后进行B3=5、B1=7删数操作,结果见下图;

5-7-2、B行数独格B5(4、8)和B7(4、8)同有待选参数4和8两个数字,同行B9(2、4、8)可以消除4和8变成B9=2;

G3(8、9)和H3(8、9)位置既在第三列,又在左下小九宫中,因而可以同时对第三列和左下小九宫其他数独格消除参数8和9;

5-7-3、再先后以B9=2、H1=2进行删数操作,结果见下图;

5-7-4、根据唯一候选数填数法原则填数:

第2列只有F2含有参数2,故直接填数F2=2;

第A行只有A4含有参数2,故直接填数A4=2;

右上宫(A7:C9)中只有C8含有参数7,故直接填数C8=7;

中右宫(D7:F9)中只有E8含有参数5,故直接填数E8=5;

右下宫(G7:I9)中只有G8含有候选数2,故直接填数G8=2;

5-7-5、再以A4=2、G8=2在各自所在的单元格所在的行、列、宫进行删数,结果见下图。

5-8、令G6=9试数:

在I3=1、B3=5后,选择双值格G6(3、9)作为新的节点;

5-8-1、数独表先后进行G6=9、G3=8、D6=3、D8=6、H8=8、A8=3、A3=6、C1=1、A2=8、A9=9、C3=3、C8=8、F6=1、B5=4、B7=8删数操作;

5-8-2、数独第7列单元格E7=F7=9数值重复与数独规则相矛盾,因而在I3=1和B3=5推理链下,G6=9节点需要删除。

5-9、令G6=3试数:

双值格G6(3、9)作为新的节点,当以G6=9试数时最终出现错误结果(False),再转而令G6=3;

5-9-1、数独表先后进行G6=3、D6=9删数操作;

5-9-2、右下宫(G7:I9)中G7含有唯一的候选参数1,故G7直接填数1;

5-10、令F3=3试数:

选择双值格F3(3、6)设置新的节点,令F3=3试数并进行删数操作。

5-10-1、数独表先后进行F3=3、E2=1、A3=6删数操作;

5-10-2、A行中A2和A8候选参数都有仅只有3和8,因而A5和A9的候选参数能删除这两个候选参数,删数完成后A9=9,而A5则进一步删除后,直接填数A5=1;

5-10-3、数独表先后进行A9=9、A5=1、C6=8、B5=4、B7=8、A8=3、D8=6删数操作;

5-10-4、数独第7列E7=F7=9数值重复,与数独规则相矛盾,因而该节点需要舍去;

5-11、令F3=6试数:

选择双值格F3(3、6)设置新的节点,令F3=6进行删数操作;

5-11-1、数独表先后进行F3=6、A3=3、F4=5删数操作;

5-11-2、数独F行F1(1、9)、F6(1、8)、F7(8、9)三个单元格有且只有三个候选参数1、8、9,因而同行F5可以删除候选参数1、8而直接填数3;

5-11-3、数得表进行F5=3删数操作;

5-11-4、数独D行D4(4、6)和D5(4、6)两个单元格有且只有两个候选参数4、6,因而同行的D8可以消除候选数6而直接填数D8=3;

5-11-5、第1列E1和F1两个单元格有且只有两个候选参数1、9,因而同列的C1可以消除参数1而直接填数字6,即C1=6;

5-11-6、第七列B7(4、8)、C7(4、8、9)、F7(8、9)三个单元格有且只且三个候选参数4、8、9,因而同列的E7可以消除参数8和9直接填数6,即E7=9;

5-11-7、第二列A2和C2两个单元格有且只有两个候选参数1和8,因而E2可以消除参数1直接填数3,即E2=3;

5-11-8、C行C2和C8两个单元格有且只有两个候选参数1、8,因而C5、C7和C9都可以约除参数1、8,随后C4和C7两个单元格共有参数4和9,进一步删数操作后C5=5,C9=3;

5-11-9、E4进行删数操作,最终结果见下图。

5-12、双值格C3(1、8)设为新的节点,现以C3=1试数:

5-12-1、数独表进行C3=1、A2=8、A8=6、A9=9、A5=1、C6=8、C7=4、B7=8、F7=9删数操作,结果如下图

5-12-2、数独F行F1=F6=1数值重复,与数独同行、列、宫不能出现相同数字的规则相矛盾,因而该节点C3=1分支予以删除。

5-13、双值格C3(1、8)再以C3=8试数:

5-13-1、数独表进行C3=8、A2=1、C6=1、F6=8、F7=9、E9=8删数操作;

5-13-2、由于双数格G9和H9同列又同宫且有且只有两个候选参数4和6,因而可以同时约去H8和A9的相同候选参数,而H8直接填数8,A9直接填数9

5-13-3、数独表进行A9=9、A5=8、B5=4、D5=6、E5=1、H8=8、H3=9、H5=7、H2=4、H9=6、G5=9删数操作;

5-13-4、数独最终解出来并核对无误,结果见下图:

5-14、整个数独求解链试数如下:

结论:

对于较简单的以及复杂程度中等的数独,掌握一些复杂的删数技巧可以大幅度提高求解速度,但这些技巧,对于难度非常大且必须经过多层试数的“骨灰级数独”以及“专家级数独”,往往显得无处着手。因而对于求解高级数独,试数比删数和填数更加重要,而要想有效试数,清晰的逻辑比复杂的技巧更为重要。

以下两个数独,作者用上述数独求解方法都给出了正确答案,其中号称史上最难的数独,笔者求解共用了三天。欢迎广大数独爱好者给出答案并交流心得体会!

数独一:

数独二:

数独大师级技巧_零基础入手攻克专家级数独难题实战案例相关推荐

  1. 数据结构和算法_零基础入门01

    数据结构和算法_零基础入门01 一.数据结构是什么? 逻辑结构.物理结构 二.算法 算法的五个基本特征 算法设计的要求 b站学习小甲鱼的数据结构与算法,自留笔记. 程序设计=数据结构+算法 一.数据结 ...

  2. 【创科之龙】零基础学习嵌入式开发以及项目实战开发【第二期视频】

    [创科之龙]零基础学习嵌入式开发以及项目实战开发[学习交流零基础火热进行ing] 大家好,我是aiku,上期的项目学习资料在电子发烧友论坛上分享,大家觉得都很好. 在这里我首先要感谢电子发烧友给我们的 ...

  3. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

  4. 零基础学习嵌入式入门以及项目实战开发【手把手教+国内独家+原创】

    零基础学习嵌入式入门以及项目实战开发[手把手教+国内独家+原创] 独家拥有,绝对经典                            创 科 之 龙 嵌入式开发经典系列教程 [第一期] 主讲人: ...

  5. python dict 合并同类项_零基础入门学习Python,这13个Python惯用小技巧一定要收藏...

    原标题:零基础入门学习Python,这13个Python惯用小技巧一定要收藏 Python的小技巧很多,入门容易精通难!在进阶的路上,有没有什么好的技巧和好的方法,就是不断总结,不断记笔记!尤其是好的 ...

  6. 零基础学cad要多久_零基础学CAD,快捷键倒背如流值得一试,很有技巧,实用操作!...

    想要瞬间快速的入门,精通AutoCAD,以及玩转绘图设计 快捷键口诀一定要少不了,当然也离不开你不断的练习操作~ 除了各种自学视频,练习题操作,快捷键口诀绝对是重点了! 都有哪些呢?零基础自学CAD需 ...

  7. 3d量测怎么学距离_零基础学习3D建模用这几种方法,学习效率提升没毛病

    相信大部分学习游戏建模的人都是因为对这个行业有兴趣,才会想去学习,当然也有一部分的人是看到这个行业的前景会发展的不错想转行的. 很多人在学习的时候都会出现的一个问题,就是感觉怎么学习都做不好,记得软件 ...

  8. python编程需要安装什么软件_[零基础学pythyon]安装python编程环境

    注:推荐一种非常重要的学习方法 在我这里看文章的零基础朋友,乃至于非零基础的朋友,不要希望在这里学到很多高深的python语言技巧. "靠,那看你胡扯吗?" 非也.重要的是学会一些 ...

  9. highcharts如何把图多余的空白页面_零基础如何快速学会WORD基础操作?有秘籍了.........

    WORD虽然很简单,但是还是有一部分朋友从来没有使用过这款软件,可以说是零基础.本文作者针对这部分朋友,亲自一个字一个字的写了这篇2000多个字的教程,非常的累.希望能够帮助这部分朋友快速的掌握WOR ...

  10. 零基础自学java的难处_零基础自学Java 在学习中要注意哪些问题

    如果是零基础自学Java编程,在学习过程中有很多要注意的问题,想要学好学精必然是件难事,并且可能会走弯路浪费很多时间,短时间内是不可能学成参加工作的,想要成为专业的Java程序员并不容易,技术过硬尤为 ...

最新文章

  1. 县分计算机维修报废流程图,实验9 氨基甲酸铵分解反应标准平衡常数的测定.doc...
  2. SQL点滴22—性能优化没有那么神秘
  3. iptables 一些有用的规则
  4. 一个优雅的报警处理系统范例
  5. 听说Java老古董了?快被淘汰了?高级开发:我还就真看上它了!
  6. 在类中用class时数据是共有还是私有_C++判断题题库1
  7. cygwin安装wget
  8. SQLServer2008R2精简版使用
  9. C++ 使用replace()方法替换字符串中的反斜杠:左斜杠(\)和右斜杠(/)
  10. UNIX 环境高级编程读书笔记(1)
  11. 【2020.09.05】基金基础问题答疑汇总
  12. CSAPP拆弹实验/炸弹实验
  13. 前度面试总结,被问的概率极大
  14. 平安电工冲刺深交所:年营收8.8亿 为潘协保家族企业
  15. 透过历史迷雾进行深入探究特斯拉线圈是如何工作的?
  16. 通过源码分析Mybatis运行原理
  17. innodb锁-意向锁
  18. 手写:下划线转为驼峰命名法
  19. 运算符优先级(总结)关于与的区别 ||与|的区别
  20. 蓝桥《最大和》python题解

热门文章

  1. 卸载 vista sp1
  2. 华为交换机CPU处理报文原理
  3. 什么叫反向链接?什么是死链接?什么是错误链接?
  4. DASH NET(网速控制,可变)
  5. java实现QQ空间日志列表获取
  6. excel表格中怎样让某一行数据一直显示
  7. 插件框架篇一之scrollbars
  8. cisco设备上查SFP模块sn
  9. 训练集、验证集、测试集以及交验验证的理解
  10. android台式电脑系统安装,怎么在台式机上安装安卓系统