数独的Y翼策略


11

我最近获得了一个新的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同一列中已经有一个,所以我们可以删除的73,而根本没有任何候选人。这显然是不可能的。因此,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] # -||-

一个输入中的多个集合可以完全相同吗?
Optimizer

@Optimizer是的,例如在第8个测试用例中,7 8是第一个和第二个单元格的候选对象。Y翼策略仍然可以应用。
贾库比

@Jakube啊,好的,没看到。
Optimizer

如果可能有不止一种解决方案,我可以输出其中一种吗?
Optimizer

是的,我在问题中对此进行了澄清。
Jakube 2015年

Answers:


3

CJam,90个字节

g,这太长了,因为其他3个像元只能有2个候选项。

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

这期望输入以CJam格式的列表列表。例如:

[[2 6] [3 6] [3 7] [6 7]]

以列表格式的CJam列表给出输出:

[[2] [3 6] [3 7] [6 7]]

打完高尔夫球将添加说明。

在这里在线尝试在尝试整个测试套件


3

Mathematica,124字节

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

例子:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

Out[3]= {{4, 7}, {7, 8}, {4, 8}, {}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.