我最近获得了一个新的Sudoku应用程序,该应用程序可以生成非常难的Sudoku,这无法使用标准策略来解决。所以我必须学习一些新知识。这些策略之一是Y翼策略。它被列为“艰难策略”,但实际上并不难。
例
对于此策略,只有4个单元很重要。因此,我忽略了图像中的所有其他单元格。
我们查看每个单元的所有候选。在以下示例中,我们有一个包含候选对象的单元格3 7
(这意味着我们已经拒绝了这些候选对象1 2 4 5 6 8 9
,例如,因为1
在同一行中有一个2
,在同一3x3框中有一个...),一个具有候选对象的单元格6 7
,有候选人3 6
的牢房和有候选人的牢房2 6
。Y翼策略将建议,6
可以将其从彻头彻尾的单元格的候选项中删除,只留下一个可以2
作为填充项的候选项。因此,我们找到了一个正确的数字,并且在解决完整数独问题上又迈进了一步。
为什么可以将6
其删除?
说明
让我们假设,对于6
正确的单元格,正确的数字是。现在6
在此列中有一个,因此我们可以6
从右上方单元格的候选项中删除,仅留下一个7
,我们可以填写。左下方单元格也是如此。我们可以删除6
并填写3
。现在,如果我们看一下左上方的单元格,就会发现矛盾。因为现在7
在同一行和3
同一列中已经有一个,所以我们可以删除的7
和3
,而根本没有任何候选人。这显然是不可能的。因此,6不能是正确的直立单元格数。
更精确地讲:如果我们有4个具有候选对象的单元格[A B] [A C] [C D] [B C]
(按此顺序或循环旋转),并且这些单元格(通过相同的行,相同的列或相同的3x3框)连接成一个圆(单元格1连接到了单元格2,连接到单元3,该单元3已连接到单元4,该单元4已连接到单元1),那么您可以C
从该[C D]
单元中卸下它。这是至关重要的,这三个细胞[A B]
,[A C]
并且[B C]
只包含各两名候选人。不同地,该单元[C D]
可能包含更多或更少(D
可以是零,一个或什至更多个候选)。
请注意,我明确表示可以使用任何一种方式进行连接。在下一个示例中,您可以看到策略再次被应用。但是这次这4个单元格没有形成矩形。左下和右下单元格是简单连接的,因为它们位于同一3x3框中。Y-Wing说,我们可以删除1
左上单元格的as候选。这次,该单元格中还剩下2个候选者,因此我们实际上没有找到新的正确数字。但是尽管如此,1
罐的拆除为不同的策略打开了大门。
如果您需要有关该策略的更多信息或更多示例,请访问sudokuwiki.org。
挑战规格
您将收到4个列表作为输入,代表这些单元格的候选项。四个单元以圆形连接(单元1连接到单元2,单元2连接到单元3,单元3连接到单元4,单元4连接到单元1)。您可以假定每个列表都按升序排序。
您的工作是通过应用Y翼策略删除一名候选人,并以相同的顺序返回结果候选人列表。如果您无法应用该策略,则只需返回相同的候选人列表即可。
如果有两种可能的解决方案(您可以删除单元格B的A或删除单元格D的C),则只返回一个解决方案。哪一个都没关系。
输入可以是任何本机列表或数组格式。您还可以使用列表列表或类似内容。您可以通过STDIN,命令行参数,提示或函数参数接收输入,并通过返回值或简单地通过打印到STDOUT返回输出。
这是代码高尔夫球。最短的代码(以字节为单位)获胜。
测试用例
[3 7] [6 7] [2 6] [3 6] => [3 7] [6 7] [2] [3 6] # Example 1
[6 7] [2 6] [3 6] [3 7] => [6 7] [2] [3 6] [3 7] # Example 1, different order
[2 6] [3 6] [3 7] [6 7] => [2] [3 6] [3 7] [6 7] # Example 1, different order
[3 6] [3 7] [6 7] [2 6] => [3 6] [3 7] [6 7] [2] # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9] => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4] => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8] => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4] => [4 7] [7 8] [4 8] [] # Fictional example
[3 7] [2 6] [6 7] [3 6] => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4] => [4 7] [2 7 8] [4 8] [1 4] # -||-
7 8
是第一个和第二个单元格的候选对象。Y翼策略仍然可以应用。