Algorithm 寻找最佳拟合矩形的坐标

Algorithm 寻找最佳拟合矩形的坐标,algorithm,computational-geometry,Algorithm,Computational Geometry,输入: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 输出将为:60 8 5 你能给我一些提示吗?在这里,我需要使用动态编程 如果假定所有坐标都

输入: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
输出将为:60 8 5
你能给我一些提示吗?在这里,我需要使用动态编程

如果假定所有坐标都是整数,那么可以考虑所有可能的矩形,宽度为代码< > 和高度>代码> > B < /代码>,以宽度
A
和高度
B
刻在边界矩形内-很容易看到它们的编号是
O(AB^2)
。您需要检查每个这样的矩形与
N
预定义矩形的交点。有这样的数据结构,允许您在
O(logN)
时间内进行一次交叉测试

在更一般的情况下,您可以使用这种方法,而且速度会快得多。我将在这里简要描述一下

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

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

向右移动滑动矩形
T
,直到其左侧达到
S[1].x
坐标。同样,您可以使用数组
S
查找与
T
相交的活动集,并执行与前面相同的局部分析。如果你能在滑动矩形中找到一个空白,把它和已经找到的比较,记住最好的结果


继续此过程,直到滑动矩形
T
到达边界矩形的右侧。这里的移位数是
O(N),该算法的时间复杂度取决于在每一步找到一个空空间的效率。这里有许多方法是可行的——最简单的方法是基于
Y
-坐标的排序。还可以使用一些数据结构表示活动的矩形集。我假设把所有的坐标都是整数,如果你假设所有的坐标都是整数,那么你可以考虑宽度为<代码> > <代码> >高度>代码> > b>代码>,在宽度为<代码> > <代码> >高度>代码> b>代码>的边界矩形内,很容易看到它们的编号是“代码>O(ab ^ 2)< /代码>。您需要检查每个这样的矩形与
N
预定义矩形的交点。有这样的数据结构,允许您在
O(logN)
时间内进行一次交叉测试

在更一般的情况下,您可以使用这种方法,而且速度会快得多。我将在这里简要描述一下

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

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

向右移动滑动矩形
T
,直到其左侧达到
S[1].x
坐标。同样,您可以使用数组
S
查找与
T
相交的活动集,并执行与前面相同的局部分析。如果你能在滑动矩形中找到一个空白,把它和已经找到的比较,记住最好的结果


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

你能详细解释一个输入输出案例吗?如果没有任何标记,您的图表是无用的。宽度
a