将具有一定大小的矩形放入矩阵

时间:2017-08-14 08:52:52

标签: algorithm matrix rectangles

问题
我需要将大小为n×m的矩形放入大小为N×M的矩阵的自由区域,其中N=n*2-1M=m*2-1。如果矩阵单元格为true,则认为它是免费的,如果它是false则被占用。中心单元格始终为true,由于矩形和矩阵的大小,中心单元格始终位于矩形内部。

附加要求是矩形和中心单元的左上角之间的距离必须尽可能小。

n=8m=5的示例:

111111101111111;111111111111111;111111111111111;111111111111111;110111111111111;111111111110111;111111111111111;111111111011111;111111111111111

灰色单元格 - 占用,绿色 - 中心单元格,蓝色单元格 - 解矩形,红线 - 矩形左上角与中心单元格之间的距离。

尝试
蛮力解决方案将具有O(N×M×n×m)时间复杂度,这不是非常优化的。如果我预处理矩阵,我可以消除某些单元格中的计算,但这仍然会花费太多时间。

最初我认为我可以采用Max Rectangle Problem并且只是修改条件从max到需要,但是它走到了死胡同(我需要列出直方图中的所有矩形,我不知道如何)。然后我认为它就像打包问题,但我能找到的只是它的版本,最初是完全空的空间和多个矩形,这不适用于这个问题。

上下文
在过去,当用户点击网格时,我的程序会放置矩形,左上角与点击点重合,如果它是空的,如果它已经占用了矩形所在的单元格则会失败。我决定修改这种行为,而不是失败,找到最合适的矩形位置,同时仍然包含一个点击点。在上面的矩阵图中,单击点是绿色单元格,矩阵大小表示矩形的所有可能位置。

P.S。如果可能的话,我更喜欢真实的语言示例而不是伪代码。我的程序是用Java编写的,但任何语言都可以。

1 个答案:

答案 0 :(得分:4)

您可以通过以下方式在O(N.M)空间和时间复杂度中执行此操作:

  1. 计算O(N.M)
  2. 中的summed area table
  3. 迭代所有左上角,检查矩形中的求和区域是否等于n.m,如果到中心的距离有所改善,则更新最佳位置。每个左上角的测试结果为O(1),左上角有O(N.M)个,因此整体O(N.M)
  4. 关键思想是总和区域表允许您在O(1)时间内计算任意矩形的总和。