簡體   English   中英

用於消除最小數量的矩形的算法

[英]Algorithm to dins minimal number of rectangles

我在坐標系中有一個矩形區域R,在R里面有一組點P.所有邊都與軸平行,所有點都是整數。 我想以這樣的方式將R分成更小的矩形

(a)矩形的邊或者粘在R的兩側,或者包括至少一個P和P的點

(b)在每個矩形內,與P恰好有一個點

我必須找到覆蓋P的所有點的最小量的矩形。這里繪制一個例子: http//i5.minus.com/jC5LnVhjk6soT.png紫色線表示不正確的分割,因為上面的矩形沒有包括來自P的點。然而,藍線非常好,因為兩個矩形都有一個來自P的點,所以正確的輸出將是:2,因為這是矩形的最小量。

有沒有人知道找到最小數字的算法/方法?

根據你的規范,我最終得到了這個遞歸算法:(偽代碼〜ruby實現)

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習語的問題。 它只是整個過程的偽代碼示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM