所以我有一个6m x 2.25m
的矩形,另外还有4个具有静态尺寸的矩形,但它们随机放置在全局矩形内。
我需要有一个函数,该函数可以计算最大矩形的面积,该面积可以适合外部矩形,也不会与其他矩形重叠。
我考虑过要找到小矩形之间的最大x距离,但是取决于它们是横向还是纵向,x可能无法完成任务。在这一点上,我还是很困惑,我在网上找不到很多有关此操作的信息,但是对于有经验的编码人员,我相信这是一项很普通的任务。
更新: 这是一个示例图像,显示了我要描述的内容。彩色矩形是按照静态尺寸随机放置的,我想找到最大的矩形。
感谢您的时间!
答案 0 :(得分:2)
作为起点。在时间和空间复杂度上,较小矩形的数量为平方。
1)根据较小的子矩形的尺寸(图中的紫色线)将大矩形划分为子矩形。最佳矩形将始终具有由这些子矩形组成的边界。
2)标记出不属于最终结果的填充子矩形(图中的红色和黄色矩形)
3)现在我们遇到了搜索问题。我们可以使用任何搜索算法(我正在使用DFS)。您可以对此进行优化(例如缓存),但是为了简单起见:
frontier = queue(all subrectangles)
largest_area = None
while frontier is not empty:
rectangle = pop a rectangle off frontier
if all subrectangles to the right of rectangle are unoccupied:
add (rectangle + extra subrectangles to the right) to frontier
largest_area = max(area of new rectangle, largest_area)
else if all subrectangles below rectangle are unoccupied:
add (rectangle + extra subrectangles below) to the frontier
largest_area = max(area of new rectangle, largest_area)
print largest_area
说矩形是绿色矩形。可能的后续状态是将子矩形添加有蓝色星号或将子矩形添加有粉红色星号。但是,粉红色的星星与黄色的矩形重叠,因此我们无法添加。
答案 1 :(得分:1)
最佳矩形应使其与四个边上的其他矩形接触(否则可以将其放大)。因此,您将搜索范围限制为可用坐标。
暴力破解解决方案可以按以下方式工作:
列出所有横坐标和纵坐标(包括外部界限)并对其进行逐步排序;
对于每个(横坐标,纵坐标)组合,找到以该点为左上角的最大矩形,如下所示:
对于每个(横坐标,纵坐标)组合(例如,横坐标>横坐标和纵坐标>纵坐标),将此点用作矩形的右下角,并进行如下测试:
对于每个给定的矩形,检查它是否与被测矩形重叠;如果有重叠,请忽略此候选。
如果没有重叠,则该候选人被接受;计算其面积并保持最大面积。
对于N个矩形,此过程可以执行O(N ^ 5)个操作,因此仅适用于非常小的N。
您可以通过将每个横坐标,纵坐标替换为其索引并在位图中表示矩形来加快此过程。您可以在该位图中绘制每个缩小的矩形。
然后,当您要测试候选矩形时,请尝试向右移动最长的空白像素;然后尝试下一行并找到最长的空白像素行,该行不长于上一行;等等,直到位图的底部(这样可以确保您尝试所有可能的矩形)。每次尝试矩形时,都将获取原始坐标并计算出实际面积。
下面是原始矩形,然后是压缩的位图表示形式,并从标记的一个开始尝试了像素(尝试了四个矩形)。