找到最小数量矩形的算法

时间:2013-11-21 18:13:04

标签: algorithm coordinates rectangles

我在坐标系中有一个矩形区域R,在R里面有一组点P.所有边都与轴平行,所有点都是整数。我希望以这样的方式将R分成更小的矩形

(a)矩形的两边要么粘在R的两边,要么包括至少一个来自P的点

(b)在每个矩形中,只有一个点来自P

我必须找到覆盖P的所有点的最小量的矩形。这里绘制一个例子:http://i5.minus.com/jC5LnVhjk6soT.png紫色线表示不正确的分割,因为上部矩形不包括P的点然而,蓝线非常好,因为两个矩形都有一个来自P的点,所以正确的输出是:2,因为这是最小的矩形量。

有没有人知道找到最小数字的算法/方法?

1 个答案:

答案 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_verticalsplit_horizontal将区域R与通过点p的垂直线和水平线分开。

您还可以使用动态编程优化此算法。您可以存储子矩形的结果,而无需另外计算它。当几个点位于同一条线上时会发生这种情况。

ps:不要复制原始源代码,您可能会遇到nil习惯用法的一些问题。它只是整个过程的伪代码示例。