在我们Puzzling.SE的朋友那里,发布了以下拼图:这个半彩色拼图是否始终可以解决?由Edgar G.你可以发挥它在这里。
拼图说明
给定一个m x n
网格,其中包含三种不同颜色的图块,如果它们的颜色不同,则可以选择任意两个相邻图块。然后将这两个图块转换为第三种颜色,即这两个图块未表示的一种颜色。如果所有图块都具有相同的颜色,则难题就解决了。显然,一个可以证明的是这个难题始终是可解的,如果没有m
,也不n
是被3整除。
当然,这乞求一种求解算法。您将编写解决此难题的函数或程序。请注意,stdout
明确允许具有“副作用”的函数(即,输出处于打开状态,而不是某些尴尬的数据类型返回值)。
输入输出
输入将是一个m x n
由整数的矩阵1
,2
和3
(或0
,1
,2
如果方便的话)。您可以以任何理智的格式接受此输入。这两个m
和n
的>1
,而不是被3整除你可以假设这一难题没有解决
然后,您将解决难题。这将涉及重复选择两个要“转换”的相邻图块(请参见上文)。您将为求解算法采取的每个步骤输出这些图块的两个坐标。这也可以是任何合理的输出格式。您可以自由选择从0索引到1索引之间的索引,还是先索引行还是列。但是,请在您的答案中提及这一点。
您的算法应在合理的时间内在原始8x8情况下运行。暴力破解它完全是明令禁止的,即你的算法应该下运行O(k^[m*(n-1)+(m-1)*n])
与k
所需的解决方案的步数。但是,该解决方案并不需要是最优的。链接问题中给出的证明可以使您了解如何执行此操作(例如,首先仅使用垂直相邻的图块来创建所有列,然后再执行所有行)
测试用例
在这些测试用例中,坐标是基于1的,并且首先对行进行了索引(如MATLAB / Octave以及可能的许多其他索引)。
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
如果需要,我可以发布较大测试用例的pastebin,但是我认为这应该足够了。