标准数独进阶篇⑧
鱼(链列)一种结构的称呼,它跟数组很类似但又不太相同,鱼的逻辑是n个数字a刚好填入且只能填入n行n列时,这个结构形成稳定,那么在结构以外的区域不能再填入数字a,否则结构内数字a会填不满导致无解。其中,决定鱼结构的行/列叫做定义域,鱼的结构涉及到所有单元格叫做鱼身,鱼结构成立后能删除数字的区域叫做删除域。定义域如果是行,那么删除域就是列,反之亦然,当然也有宫内的删数格,这是鱼的扩展,不会出现在这个篇章的内容当中,这里主要介绍的还是标准鱼的构造。
鱼跟数组一样也有规格,也有互补的另一条鱼。涉及到两行两列的鱼称为xwing(二阶鱼、二链列,以此类推),涉及到三行三列的鱼称为剑鱼,涉及到四行四列的鱼称为水母,再更高阶级的鱼因为很少见到就不介绍了。
-------
图1是xwing的例子。可以观察到,在r6中,数字1能填的格子只有r6c69两格,r8中数字1也只能填入r8c69两格,刚好只处于两列两列,那么c7/c9的其他位置不能填1否则r6或者r8会有一个位置填不了任何1。(用共轭对或者区块的视角来看的话,无论1填在r6/r8行哪个位置,在另外一行都会在另一个位置为真,所以在c6/c9的其他位置就不能填1了。)在图1里,r6r8就是定义结构的定义域,r68c79四个格子就是鱼身的构造,c7c9就是删除域,删除格为删除域上鱼身以外的其他单元格。
------
图2是剑鱼的例子,定义域是r689,鱼身是r69c86/r89c8/r689c9的几个单元格,删除域是c689。可以看到r689中,数字1能填入的格子刚好只处于三行三列。
-------
图3是水母的例子,定义域是c3679,鱼身是r3c379/r4c67/r6c39/r9c36的几个格子,删除域是r3469。可以看到c3679中,数字1能填入的格子刚好只处于四行四列。
-------
图4是图3中水母的互补,当我们把定义域换成行删除域换成列后,会发现在r158能找到一个剑鱼(绿色格子),这个剑鱼就是这个水母的互补。我把删数格中跟数字1提示数有交集的单元格涂掉之后,可以看到两条鱼删除的单元格是一致的。
----
受限于篇幅,鱼的其他拓展(鳍鱼/残缺鱼/孪生鱼)就自己找教材学习了,到此进阶篇就结束了,再更高难度的题型中需要用到的技巧我只会在高难度篇介绍一下xr/ar/ul/环这几个结构,其他技巧在这里就讲不清楚了,需要自己花时间精力去学习才行。