算法:重新排列2D矩阵(通过元素'翻转')

时间:2009-08-28 00:53:41

标签: algorithm

我想知道一个算法解决以下问题(有效地):一个数字[1..9]的二维矩阵需要在从顶部(1)到底部(9)的水平线上对齐,但只能通过翻转垂直或水平与另一个数字。

示例输入矩阵:

1 8 2 6 1 6
9 2 5 1 6 2
3 6 9 2 9 8
5 1 7 4 2 8
4 2 7 6 9 5 

1 8 2 6 1 6 9 2 5 1 6 2 3 6 9 2 9 8 5 1 7 4 2 8 4 2 7 6 9 5

所需的输出矩阵:

1 1 1 1 2 2
2 2 2 2 3 4 
4 5 5 5 6 6
6 6 6 7 7 8
8 8 9 9 9 9

关于'翻转'的澄清:以输入矩阵为例。左上角有一个“1”。 1可以在其旁边的8处水平翻转(第一行现在变为1 1 1 1 2 2 2 2 2 2 3 4 4 5 5 5 6 6 6 6 6 7 7 8 8 8 9 9 9 9 )或垂直翻转,其下方为9(第一列现在变为)。它不能用2对角翻转。

这个问题的任何解决方案(任何语言都没问题)?

2 个答案:

答案 0 :(得分:2)

好的谜题!无论如何,您可以尝试修改版本的排序算法。我在实现方面不太好,但我可以试着给你一个。另一种解决方法是通过A *算法。它是人工智能中使用的路径搜索算法,但我已经看到它适用于类似的问题。

答案 1 :(得分:0)

关于不能对角翻转的部分是红鲱鱼。 (只需翻转一个元素旁边的元素,然后是元素下面的元素。)因此,任何元素都可以通过重复翻转与矩阵中的任何其他元素交换。继续这一推理,您将看到您所需的最终状态是一个矩阵,其中包含按升序排列的元素,从左到右,从上到下增加(如在最终状态中)。

要快速生成最终结果,只需将初始矩阵从2-D数组重新整形为平面列表。分类。然后重新塑造成二维阵列。

如果您需要了解可以生成最终结果的一系列合法移动(请注意,此类序列唯一!),以下简单算法将执行此操作:

  1. 首先定位属于左上角的元素;这是目前的立场。
  2. 在矩阵的其余部分中找到最小元素。
  3. 向左翻转此元素,直至到达当前位置的列,然后向上翻转,直至到达当前位置的行。
  4. 将当前位置标记为正确放置。
  5. 通过将当前位置向右移动一个索引移动到下一个位置,或者如果整个行已定位,则移动到下一行的开头。
  6. 重复直到整个矩阵定位。
  7. 最佳效率?不太可能。简单有效?绝对