问题
我需要将大小为n×m的矩形放入大小为N×M的矩阵的自由区域,其中N=n*2-1
,M=m*2-1
。如果矩阵单元格为true
,则认为它是免费的,如果它是false
则被占用。中心单元格始终为true
,由于矩形和矩阵的大小,中心单元格始终位于矩形内部。
附加要求是矩形和中心单元的左上角之间的距离必须尽可能小。
n=8
和m=5
的示例:
灰色单元格 - 占用,绿色 - 中心单元格,蓝色单元格 - 解矩形,红线 - 矩形左上角与中心单元格之间的距离。
尝试
蛮力解决方案将具有O(N×M×n×m)时间复杂度,这不是非常优化的。如果我预处理矩阵,我可以消除某些单元格中的计算,但这仍然会花费太多时间。
最初我认为我可以采用Max Rectangle Problem并且只是修改条件从max到需要,但是它走到了死胡同(我需要列出直方图中的所有矩形,我不知道如何)。然后我认为它就像打包问题,但我能找到的只是它的版本,最初是完全空的空间和多个矩形,这不适用于这个问题。
上下文
在过去,当用户点击网格时,我的程序会放置矩形,左上角与点击点重合,如果它是空的,如果它已经占用了矩形所在的单元格则会失败。我决定修改这种行为,而不是失败,找到最合适的矩形位置,同时仍然包含一个点击点。在上面的矩阵图中,单击点是绿色单元格,矩阵大小表示矩形的所有可能位置。
P.S。如果可能的话,我更喜欢真实的语言示例而不是伪代码。我的程序是用Java编写的,但任何语言都可以。
答案 0 :(得分:4)
您可以通过以下方式在O(N.M)
空间和时间复杂度中执行此操作:
O(N.M)
n.m
,如果到中心的距离有所改善,则更新最佳位置。每个左上角的测试结果为O(1)
,左上角有O(N.M)
个,因此整体O(N.M)
关键思想是总和区域表允许您在O(1)时间内计算任意矩形的总和。