AIC(交替推理链,Alternate Inference Chain)

简单异数链一文中我们介绍过XY-Chain技法,AIC可以看作是XY-Chain的扩展。有别于XY-Chain仅局限于双值格,AIC籍由各种强弱关系的灵活运用,极大化的丰富了链类解题方法。

Alternate Inference Chain Type 1

AIC 根据首尾两端点候选数的异同可分为两种类型,我们将首尾数字相同的称为AIC1,下图就是一个AIC1的实例。

 
图1-AIC1

​图1中,实线代表强链,虚线代表弱链(下同)。我们可以看到,虽然本例中的链行进过程中候选数一直在发生变化(由双值格、多值格内候选数强弱关系的灵活运用实现),但候选数间始终保持着强弱交替,最终首尾两个相同候选数5之间形成强关系,可以删去两端点共同作用格内的5。

Alternate Inference Chain Type 2

AIC1的首尾数字相同,还有一类AIC的首尾两端点数字不同,但因为两端的候选数可以彼此在对方单元格内看到自己,我们得以据此对相关候选数进行删除,可将之称为AIC2。

 
图2-AIC2

​图2中,链的两端点分别为4和8,彼此都可以在对方格内看到自己。简单推理就可以发现,红框中的4、8互为强关系,不管哪个成立,红圈的4、8都会被删去。由此可得出AIC2的删除规则:互为强关系的两端点候选数可对对方格内的自己进行摈除。

是不是感觉很简单?AIC的工作原理的确很好理解,但是要达到熟练运用的程度并不容易,这需要敏锐的观察力以及大量的针对练习,随后我会针对本篇的内容提供一些练习题供大家进行训练。

Nice Loop

Continuous Nice Loops (AIC Loops)

先引入一个概念“Nice Loop”,在简单异数链一文中曾介绍过XY-Cycle的结构,我们把这类从某格出发并最终回到出发格的链路称为Nice Loop。若构成Nice Loop的每个候选数都可以首尾相连且保持强弱交替,则可将之称为Continuous Nice Loops(连续环,此前介绍过的X-Wing和XY-Cycle都是简单的连续环,如果AIC能够首尾相连则会构成AIC Loops,属于较复杂的连续环)。

下图即是一个AIC连续环,与XY-Cycle一样,断开任意一条虚线(弱链),都会构成一条强始强终的数链,弱链断开处两端的候选数互为强关系,可对其共同作用格进行摈除(弱链出现在多值格内部,可删除该格内其他候选数,如本例中r78c1中的35)。

 
图3-CNL01

​图4中在格内进行的删减更多,大家可以仔细体会一下。

 
图4-CNL02

​我们将构成连续环的每个单元格视作节点,观察各节点间的联结情况(大家需要注意,寻找环时分为两个层次,第一层首先是单元格之间的关系,第二层才是单元格内候选数间的关系),会发现:

1、若某节点通过两条强链与其他节点联结,该节点单元格内联结两条强链的候选数必然相异;

2、若某节点通过两条弱链与其他节点联结,该节点必为双值格且两个候选数分别联结一条弱链;

3、若某节点通过一条强链和一条弱链与其他节点联结,该节点内联结这两条链的为同一候选数。

(熟练掌握之前内容的话,就会马上明白,以上3点是连续环成立的必然要求。)

Discontinuous Nice Loop

如果环链的某个节点不符合上述3点的要求,亦即不能满足强弱交替的规则,就会构成Discontinuous Nice Loop(不连续环)。

 
图5-DNL01

图5中是一个不连续环的实例,本例中的环以7的弱链从r1c8出发,最终以5的强链回到该格,我们将这条弱始强终的链简化为 A—B==C 进行推理:若A为真,则B为假(弱链不能同真);若B为假,则C为真(强链不能同假)。即A为真时,C必为真。回到本例中,假设r1c8=7,以此为前提,最终会推导出的结论是r1c8=5,即在同一个格内,有两个候选数同时成立,显然这种情况是违反数独规则的,由此我们可以判定之前假设的前提为假,并得出结论r1c8≠7。经过以上的归缪,可得出不连续环的一个删减规则:若某节点通过一条强链和一条弱链与其他节点联结,且该节点内联结这两条链的不是同一候选数,则联结弱链的候选数应被删去。

 
图6-DNL02

​上图是另一种情况的不连续环,本例中的环以4的强链从r8c2出发,最终又以4的强链回到r8c2格。我们假设这个格内存在起点和终点两个4,则这两个4互为强关系,不能同假。若假设起点r8c2≠4,由此前提会推导出终点r8c2=4的结论,产生矛盾,故该前提为假,r8c2=4。经过反证后我们可以得出不连续环的第二个删减规则:若某节点通过两条强链与其他节点联结,且该节点单元格内联结两条强链的是同一候选数,则该候选数为真,可删去单元格内其他候选数。

 
图7-DNL03

​图7是第三种情况的不连续环,本例中的环以1的弱链从r6c1格出发,最终又以1的弱链回到r6c1格,我们仿上例进行推理:假设r6c1格存在起点和终点两个1,这两个1互为弱关系不能同真,则由r6c1=1的前提,会推导出r6c1≠1的结论,产生矛盾,可知该前提为假,r6c1≠1。至此我们可以得出不连续环的第三个删减规则:若某节点通过两条弱链与其他节点联结,且该节点单元格内联结两条弱链的是同一候选数,则该候选数为假。

Grouped Nice Loop/AIC

在之前的文章(简单的单数链结构——双强链)里曾介绍过利用打包分组(Group)来寻找双强链的方法,这一技巧在Nice Loop和AIC中同样适用。在面对一些复杂的局面时,灵活的运用Group在行列宫制造出新的强弱关系,会让解题思路豁然开朗。

 
图8-GDNL

​上图中,利用将第2宫c4两个8(绿色圈内)打包后分别形成的与r1c5的强关系和r5c4的弱关系,以及第7宫c3两个2(绿色圈内)打包后分别形成的与r5c3的弱关系和r7c1的强关系可以找到一条不连续环,最终在r7c1中填入2。

 
图9-GCNL

​​图9实例中,分别将第8宫r9和c4的两个2打包后,可找到一条连续环,从而实现大量的删数。

 
图10-GAIC1

 
图12-GAIC2

​图11、12分别是AIC1、2的例子,大家仔细体会一下。

Group Nodes and ALS

除了使用单纯的Group做为节点联结Loop和AIC外,我们可以将思路继续发散,利用ALS候选数集间的关系,将之嵌入Loop和AIC中来解决问题。

 
图13-GDNLALS

​本例就是将ALS作为节点的一个应用,r8存在ALS{256},在这个ALS中,2和打包起来的两个5之间为强关系,巧妙利用这一关系构造出一个非连续环,可以删除r8c2格内的5。

 
图14-GCNLALS

​眼尖的朋友已经发现,图14和图9是同一个盘势。本例利用r6的ALS{238}中2和打包的两个3的强关系,以及第8宫打包的两组2(绿色圈内),构造出一个连续环,实现了对更多候选数的删减,其中候选数1、2、3(红色)的删除很好理解(弱链两端点为强关系),但第5宫和r6中红色的8为何也被删除?

这是由连续环的特性所决定的。之前的内容中多次介绍过,连续环中断开任意一条弱链后,断开处两端点互为强关系。但是,连续环的另外一个特性大家可能没有注意到:断开任意一条强链后,断开处两端点互为弱关系,亦即连续环中的任意一条链都同时兼具强弱两种属性——两端点间是矛盾关系,不能同真,亦不能同假,必然一真一假。回到本例中,r6的ALS{238}中,2和group(3)不管哪一个成立,都会导致对方不成立,从而使ALS{238}变成(28)或者(38)的数对,则group(8)在任何情况下都成立,据此可对第5宫和r6中红色的8进行摈除。​

 
图15-GAITALS

​​上图是之前在微博上单独发过的一个利用ALS联结AIT2的实例,本例关键点在于c6列ALS{147}(黄框)中7和group(4)的强关系,以及group(4)和R4C6的4的弱关系

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

数独高阶技巧入门之七——AIC & Nice Loop的更多相关文章

  1. 数独高阶技巧入门之六——ALS

    ​在这个系列的第一篇(链及其简单应用)以及第四篇(简单异数链)中已经简单介绍过ALS结构的定义,即n格中存在n+1个不同的候选数 (双值格可视为特殊的ALS结构) .根据数独规则,在组成ALS的候选数 ...

  2. 数独高阶技巧入门之三——Fish

    术语Fish代表了一组工作原理相同的关于特定候选数的解题技巧(Fish技巧直接产生自数独规则——每个单元内的数字都不能重复),Fish家族成员包括“体型”从小到大的X-Wing.Swordfish. ...

  3. 数独高阶技巧之八——SDC

    在本系列的第四篇“简单异数链”中,向大家介绍了XY-Wing等一系列Wing类技巧,并提到可以用(拐弯的)数组的观念来理解这些结构,经过第六篇ALS的学习之后,大家回过头再去看Wing,应该可以发现相 ...

  4. 读《实战 GUI 产品的自动化测试》之:第四步,高阶技巧

    转自:http://www.ibm.com/developerworks/cn/rational/r-cn-guiautotesting4/ 定义测试控件库 本系列前几篇文章对 IBM 框架做了介绍, ...

  5. 高阶 CSS 技巧在复杂动效中的应用

    最近我在 CodePen 上看到了这样一个有意思的动画: 整个动画效果是在一个标签内,借助了 SVG PATH 实现.其核心在于对渐变(Gradient)的究极利用. 完整的代码你可以看看这里 -- ...

  6. 分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程

    我发布的「正则表达式入门以及高阶教程」,欢迎学习. 课程简介 正则表达式是软件开发必须掌握的一门语言,掌握后才能很好地理解到它的威力: 课程采用概念和实验操作 4/6 分隔,帮助大家理解概念后再使用大 ...

  7. 《前端之路》之 JavaScript 进阶技巧之高阶函数(下)

    目录 第二章 - 03: 前端 进阶技巧之高阶函数 一.防篡改对象 1-1:Configurable 和 Writable 1-2:Enumerable 1-3:get .set 2-1:不可扩展对象 ...

  8. Python入门篇-高阶函数

    Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数  1>.First Class Object 函数在Python中是一等公民 函数也 ...

  9. kotlin高阶函数实战&DSL入门

    传统函数演示: 这里以电视节目“非诚勿扰”为例,男人去从一大堆美女当中挑选出自己中意的对象,比如台上有24位妹子,其档案如下: 接下来第一个男嘉宾出场啦,如下: 下面用代码来实现一下,比较简单: 先定 ...

随机推荐

  1. C# 强制删除文件,解除占用的几点思考

    有一个古老的传说: 占用的文件是可以被强制删除的... 如果被别的应用程序打开着,你就要先找到那个打开的程序,结束掉才行.或者关闭关闭相关进程,延迟的方法. 一般来说被占用就意味着有其它进行或者线程对 ...

  2. 在线程中调用其它主界面的模块,因为中间有休息1000ms,所以调用前要检查DateTimeRun变量;在From_load 启动线程;在From_closing From_closed 设置DateTimeRun=false

    //系统启动后,自动启动时钟 void jishi_kernel() { try { while (DateTimeRun) { Thread.Sleep(); if (myRunning) Runn ...

  3. e s6 知识点

    http://es6.ruanyifeng.com/#docs/reflect 1.资料对es6箭头函数中的this总结:箭头函数中的this指向的是 定义时的this,而不是 执行时的this.

  4. BUI 框架使用指南

    指南说明:只适用于对框架的剥离 如果不需要剥离则原来的东西直接粘贴就行 在主界面中使用时需要加入一下引用bui.js jquery.js config.js 末尾的文件 BUI.use(位置1, fu ...

  5. iOS学习之UIDatePicker控件使用

    iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式. ,   您可以选择自己需要的模式,Time, Date,Date and Time  , Count Down Ti ...

  6. Delphi数据库的三层架构的问题和解决方法

    Delphi数据库的三层架构的问题和解决方法 原创 2014年03月26日 16:26:03 标签: Delphi / 数据库三层架构 / DCOM / DCOMConnection 790 //-- ...

  7. MySQL数据库篇之索引原理与慢查询优化之二

    接上篇 7️⃣  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...

  8. Kafka如何保证数据不丢失

    Kafka如何保证数据不丢失 1.生产者数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到,其中状态有0,1,-1. 如果是 ...

  9. 安装了Anaconda之后,Maya运行报错,Python 找不到 Maya 的 Python 模块

    以前Maya用的好好地,结果安装了Anaconda之后,maya启动以后,日志就会报错(如下),只能自主建模,不能打开以前创建的模型,也不能导入fbx,错误提示就是Maya找不到Python模块,在网 ...

  10. linux系统启动过程及运行等级详解

    一.启动过程 1. 开机流程简述 1)加载BIOS硬件信息,并获取第一个启动设备的代号 2)读取第一个启动设备的MBR的引导加载程序的启动信息 3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试 ...