Algorithm 寻找最佳拟合矩形的坐标
输入:A,B,A,B-其中A和B表示网格的宽度和高度,A,B表示要放入的矩形的宽度和高度。然后给我N个矩形,它们已经在网格中拟合了。在接下来的N行中,我得到了每个矩形的对角顶点的坐标,例如,对于第一个矩形,输入将是(x0,y0)(x1,y1)等等。这些矩形可以重叠。我需要找到初始矩形的对角顶点的坐标,这样它就可以适合网格(我们需要打印最大高度) 示例: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 你能给我一些提示吗?在这里,我需要使用动态编程 如果假定所有坐标都
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