我在坐标系中有一个矩形区域R,在R里面有一组点P.所有边都与轴平行,所有点都是整数。我希望以这样的方式将R分成更小的矩形
(a)矩形的两边要么粘在R的两边,要么包括至少一个来自P的点
(b)在每个矩形中,只有一个点来自P
我必须找到覆盖P的所有点的最小量的矩形。这里绘制一个例子:http://i5.minus.com/jC5LnVhjk6soT.png紫色线表示不正确的分割,因为上部矩形不包括P的点然而,蓝线非常好,因为两个矩形都有一个来自P的点,所以正确的输出是:2,因为这是最小的矩形量。
有没有人知道找到最小数字的算法/方法?
答案 0 :(得分:0)
根据您的规范,我最终得到了这种递归算法:(伪代码〜红宝石实现)
def resolve R, P
if P.empty?
return nil
elsif P.size == 1
return 1
end
results = []
P.each do |p|
rect1, rect2 = split_vertical(R, P, p)
s1 = split_resolve(rect1, rect2)
rect1, rect2 = split_horizontal(R, P, p)
s2 = split_resolve(rect1, rect2)
results.push [s1, s2].min
end
return results.min
end
def split_resolve rect1, rect2
sum1 = resolve(rect1.R, rect1.P)
sum2 = resolve(rect2.R, rect2.P)
if !sum1.nil? and !sum2.nil?
return sum1 + sum2
else
return nil
end
end
函数split_vertical
和split_horizontal
将区域R
与通过点p
的垂直线和水平线分开。
您还可以使用动态编程优化此算法。您可以存储子矩形的结果,而无需另外计算它。当几个点位于同一条线上时会发生这种情况。
ps:不要复制原始源代码,您可能会遇到nil
习惯用法的一些问题。它只是整个过程的伪代码示例。