[英]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_vertical
和split_horizontal
將區域R
與通過點p
的垂直和水平線分開。
您還可以使用動態編程優化此算法。 您可以存儲子矩形的結果,而無需另外計算它。 當幾個點位於同一條線上時會發生這種情況。
ps:不要復制原始源代碼,你可能會遇到一些nil
習語的問題。 它只是整個過程的偽代碼示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.