【问题标题】:Algorithms: Rearrange 2D Matrix (through element 'flipping')算法:重新排列 2D 矩阵(通过元素“翻转”)
【发布时间】:2009-08-28 00:53:40
【问题描述】:

我想知道一种算法(有效地)解决以下问题:数字 [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 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(第一行现在变成 8 1 2 6 1 6 ),也可以垂直翻转,下面是 9(第一列现在变成 9 1 3 5 4)。不能用 2 对角翻转。

此问题的任何解决方案(任何语言都可以)?

【问题讨论】:

  • 另外,请澄清:当您说高效时,您是指算法的运行时间,还是解决方案的长度(以移动为单位)?
  • @Walt:假设移动次数越少,效率就会越高。
  • @Alex:那么那个 A* 建议真的很好。如果您的启发式小于实际剩余距离,则 A* 保证最优。
  • @WaltW 虽然 OP 说的移动次数较少,但我仍然认为他的意思是算法的运行时间。否则就不会说高效但最佳

标签: algorithm


【解决方案1】:

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

【讨论】:

  • A* 在这里是个好建议。 . .曼哈顿距离将是一个很好的启发式方法,并且在这里计算起来相当简单(只需遍历您的矩阵,求和 |xdesired - xactual| + |ydesired - yactual| 可以通过跟踪您有哪些行来轻松近似)填写计数)。
【解决方案2】:

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

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

如果您需要知道可以生成最终结果的合法移动序列(请注意,这样的序列不是唯一的!),下面的简单算法可以做到:

  1. 首先定位属于左上角的元素;这是当前位置。
  2. 找出矩阵其余部分的最小元素。
  3. 将此元素向左翻转直到它到达当前位置的列,然后向上翻转直到它到达当前位置的行。
  4. 将当前位置标记为正确放置。
  5. 通过将当前位置向右移动一个索引来移动到下一个位置,如果已经定位了整行,则移动到下一行的开头。
  6. 重复直到整个矩阵定位。

最佳效率?不太可能。简单有效?绝对的。

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 2020-11-09
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多