当前位置: 首页 > 知识库问答 >
问题:

找到面积最大的矩形,包含占用网格中的特定点

卜凯旋
2023-03-14

例如,给定一个占用网格:

...................*
*...............*...
*..*.............*..
...........*........
....................
..*.......X.........
............*.*.*...
....*..........*....
...*........*.......
..............*.....

其中,* 表示一个被占用的块,.表示一个自由块,X 表示一个感兴趣的点(或块),那么找到包含 X 但不包含任何障碍物(即任何 *)的最大矩形的最省时的算法是什么?

例如,所提供网格的解决方案将是:

.....######........*
*....######.....*...
*..*.######......*..
.....######*........
.....######.........
..*..#####X.........
.....######.*.*.*...
....*######....*....
...*.######.*.......
.....######...*.....

鉴于我们有一个已知的起点X,我不禁认为必须有一个简单的解决方案来将线条“捕捉”到外部边界以创建最大的矩形。

我目前的想法是以循环的方式将线捕捉到最大位置偏移(即转到下一行或下一列,直到遇到障碍物)。E、 g.从点X向下传播一条水平线,直到沿着该线有障碍物,然后向左传播一条垂直线,直到遇到障碍物,再向上传播一条横线,向右传播一条竖线。从四条移动线中的一条开始重复此操作,得到四个矩形,然后选择面积最大的矩形。然而,我不知道这是否是最佳的,也不知道这是最快的方法。

共有2个答案

暴乐邦
2023-03-14

一种可能的方法是以某种方式(隐含地)排除不相关的被占据的单元:那些相对于起始点在其他单元的“阴影”中的单元:

 0         1          X
 01234567890123456789 →
0....................
1....................
2...*................
3...........*........
4....................
5..*.......X.........
6............*.......
7....*...............
8....................
9....................

↓ Y

看着这张照片,你可以说

  • 矩形只有 3 个相关的 xmin 值:[3,4,5],每个值分别具有关联的 ymin 和 ymax [(3,6),(0,6),(0,9)]
  • 矩形只有 3 个相关的 xmax 值:[10,11,19],每个值分别具有关联的 ymin 和 ymax [(0,9),(4,9),(4,5)]

因此,问题可以简化为从xmin和xmax值的唯一组合的3x3集合中找出面积最大的矩形

如果考虑到选择相关占用单元的准备部分,则其复杂性为O(occ_count),如果仍需要,则不考虑排序,occ_ count是占用单元的数量。

找到最佳解决方案(在本例中为 3x3 组合)将是 O(min(C,R,occ_count)²)。min(C,R)包括您可以在R的情况下选择“转置”方法

丌官飞章
2023-03-14

这个问题是计算几何中一个众所周知的问题。这里简要描述了这个问题的简化版本(没有查询点)。查询点的问题可以用以下方式表示:

设P是平面上固定轴平行矩形B中的n个点的集合。P-空矩形(或简称空矩形)是B中包含的任何轴平行矩形,其内部不包含任何点。我们考虑将P预处理成数据结构的问题,以便在给定一个查询点q的情况下,我们可以有效地找到包含q的最大面积P-空矩形。

上面的段落是从这篇论文中复制的,其中作者描述了平面上具有< code>N个点的集合的算法和数据结构,它允许在O(log^4(N))时间内为任何查询点找到最大的空矩形。不好意思说,这是一篇理论论文,不包含任何算法实现细节。

 类似资料:
  • 这是一个面试问题。 我们被赋予各种矩形的尺寸,我们必须找出可以包围所有矩形的矩形面积(最小值)?矩形也可以旋转。 在将矩形拟合到最小可能区域之前,我曾问过一个类似的问题。 上述方法考虑了所有可能性、旋转,并在所有布局情况下确定了所有此类可能性的最小值<我们不能先求矩形面积之和,然后再求最大长度、最大宽度吗?

  • 我正在做一个与计算几何有关的个人项目。标题中的问题是对一个小子问题的抽象,我正在努力,但正在努力有效地解决。希望它足够普遍,也许不仅仅是我! 想象一下,我们在平面中有一组S矩形,所有这些矩形的边都平行于坐标轴(没有旋转)。对于我的问题,我们假设矩形交集非常普遍。但它们也非常好:如果两个矩形相交,我们可以假设其中一个总是完全包含另一个。因此,没有“部分”重叠。 我想以以下方式存储这些矩形: 我们可以

  • 下面是二进制矩阵最大面积的代码。它有一个函数MAH()来返回直方图的最大面积。方法是将二进制矩阵(2d)分解为一维。然后将MAH()应用于每个一维数组并找到最大面积。 类解决方案{ 问题链接:二进制矩阵的最大面积 MAH()函数是正确的。仅maximalRectangle(char[][]矩阵)函数无法给出结果。有人能解释一下吗?? 这是另一个人发布的maximalRectangle(char[]

  • 给定一个矩形R1和一组矩形R2、R3、…。如何找到与主矩形R1相连的所有矩形。 我不仅需要直接连接到R1的矩形,还需要所有间接连接到R1的矩形。例如,如果 R2 连接到 R1,R3 连接到 R2。R3 被视为连接到 R1。 矩形的形式为(xmin,ymin,xmax,ymax)。所有矩形都与轴平行。当矩形重叠或接触时,它们被认为是连接的。当它们仅接触角落时,它们不被视为连接。 示例: 在该示例中,

  • 我有许多对象需要渲染到画布上。我的输入是轴对齐边界框的有序列表。这些框经常重叠,但也经常在它们之间留下大面积的空白。 我想尽量减少我必须创建的画布表面面积,以便以正确的顺序渲染所有这些项目,而不必在多个画布上渲染单个对象的部分(从而避免简单地创建紧贴所有占用空间的画布)。 所以基本上,我希望紧密的对象组都呈现在同一个画布上,而不重叠的对象应该呈现在单独的画布上。但是,并不是所有重叠的对象都应该呈现