我想知道一个算法解决以下问题(有效地):一个数字[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对角翻转。
这个问题的任何解决方案(任何语言都没问题)?
答案 0 :(得分:2)
答案 1 :(得分:0)
关于不能对角翻转的部分是红鲱鱼。 (只需翻转一个元素旁边的元素,然后是元素下面的元素。)因此,任何元素都可以通过重复翻转与矩阵中的任何其他元素交换。继续这一推理,您将看到您所需的最终状态是一个矩阵,其中包含按升序排列的元素,从左到右,从上到下增加(如在最终状态中)。
要快速生成最终结果,只需将初始矩阵从2-D数组重新整形为平面列表。分类。然后重新塑造成二维阵列。
如果您需要了解可以生成最终结果的一系列合法移动(请注意,此类序列不唯一!),以下简单算法将执行此操作:
最佳效率?不太可能。简单有效?绝对