【问题标题】:Finding coordinates of best fit rectangle寻找最佳拟合矩形的坐标
【发布时间】:2020-04-30 08:38:25
【问题描述】:

输入:A,B,a,b - 其中 A 和 B 我的网格的宽度和高度,以及 a,b - 我想要适应的矩形的宽度和高度。然后给我 N - 数字矩形,已经适合网格。在接下来的 N 行中,给定每个矩形的对角线顶点的坐标,例如对于第一个矩形,输入将是 (x0,y0) (x1,y1) 等等。这些矩形可以重叠。我需要找到初始矩形的对角线顶点的坐标,以便它可以适合网格(我们需要打印最大高度) 示例:

9 5 2 4
2
1 1 3 4
1 1 6 2

输出将是:6 0 8 5 Picture of input 你能给我一些提示吗?看来我这里需要使用动态规划

【问题讨论】:

  • 你能详细解释一下输入输出的情况吗?没有任何标记,您的图表有点无用。
  • 宽度a是固定的(=2),高度b应该是最大>=4吧?
  • @HEKTO 是,但在网格边界内
  • 有趣的问题,但我认为 - 你可以改进它的措辞...... AFAIU 你的网格意味着所有矩形的角都是整数,并且新的矩形不应该与所有现有的矩形相交。你的照片也应该在你的问题之内

标签: algorithm computational-geometry


【解决方案1】:

如果假设所有坐标都是整数,那么您可以考虑宽度为a 和高度>=b 的所有可能的矩形,内接在宽度为A 和高度B 的边界矩形内 - 这很容易看到他们的号码是O(AB^2)。您将需要检查每个此类矩形与您的 N 预定义矩形的交集。有像Quadtree 这样的数据结构,可以让你在O(logN) 时间内进行一次交叉测试。

在更一般的情况下,您可以使用Plane Sweep 方法,它会更快。我在这里简单描述一下。

首先,您需要对您拥有的所有X-坐标进行排序 - 包括边界矩形的坐标(您称其为 grid)。这个排序数组S 的每个元素都应该存储X 坐标值本身以及它所属的矩形编号,以及一个标记该矩形左侧或右侧的标志。

现在想象一个“滑动”矩形T,宽度为a,高度为B,位于边界矩形内的最左侧 - 它的左侧将具有S[0].x 坐标。您可以找到所有与矩形T 相交的矩形,仅查看数组S - 我们将这组矩形称为活动集。您需要确定在T 与活动集的交集处是否有高度为>=b 的空白空间。记住宽度为a 和高度为>=b 的最大矩形(如果存在)。

将滑动矩形T 向右移动,直到其左侧到达S[1].x 坐标。同样,您可以使用数组S 来查找与T 相交的活动集,并执行与以前相同的本地 分析。如果您能在滑动矩形内找到一个空白区域,请将其与已找到的区域进行比较并记住最佳结果。

继续这个过程,直到滑动矩形T到达边界矩形的右侧。这里的班次数是O(N),这个算法的时间复杂度取决于你在每一步找到一个空白空间的效率。这里有很多可能的方法——一种最简单的方法是基于Y-坐标的排序。您也可以使用某些数据结构来表示活动的矩形集。我把这部分留给你。

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2016-07-25
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多