我的原始的方法。在最佳解決方案需要重疊矩形的情況下(例如,在0s的背景上1s的「+」),這不起作用。
- 找到包含所有1的最小邊界矩形。
- 你的第一個矩形從延伸左上角這個邊框和你的第二個外接矩形從該邊界矩形的 右下延伸。
- 對於邊界矩形的頂部和底部之間的每一行R,創建從頂部至R和 從底部至R延伸的候選矩形,邊界矩形的兩個寬度。
- 減少這兩個候選項,使它們成爲它們中1的最小邊界矩形。這些矩形對所有滿足 點1從步驟2保持在所有R.
- 重複最小的一個,以覆蓋在整個邊界矩形每對角部,並保持最佳的解決方案的整體。
在一個有效的解決方案的幾個中途終止的嘗試之後,每一個在某些情況下失敗了,我認爲這會找到最好的解決方案的唯一方法如下:
你只需要考慮1s的邊界矩形。兩個邊界矩形不會位於該區域之外。假設邊界矩形從行(R1,C1)到(R2,C2)。
For S1 in R1 to R2
For S2 in S1 to R2
For D1 in C1 to C2
For D2 in D1 to C2
Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains
Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is a candidate solution.
Reduce the rectangle (R1, D1)-(R2, D2) to be the minimum bounding rectangle of the 1s it contains.
Reduce the rectangle (S1, C1)-(S2, C2) to be the minimum bounding rectangle of the 1s it contains that aren't already in the other rectangle. This is another candidate solution.
選擇您找到的最佳候選解決方案。
注:
最好的解決方案將不具有重疊的矩形,因爲這樣的解決方案總是可以通過減小矩形的一個,使之不再交疊得到改善。因此,我們只需要在步驟3中選擇一個R(而不是每個矩形的獨立最大行)。
- 無論你是按行(R)還是按列(C)拆分都沒有關係,但是不需要兩者兼而有之。爲了提高速度,你可以在邊界矩形短而胖的時候選擇行,在高和薄的時候選擇列。
- 如果您發現一個候選解決方案,其中任何一個矩形都不包含任何零,那麼它必須是最好的解決方案,您可以停止。
兩個覆蓋矩形是否允許重疊? (請編輯回答問題) –
[最小區域矩陣覆蓋]的可能重複(http://stackoverflow.com/questions/8033951/minimal-area-matrix-covering) –
重複的問題,但沒有答案。 –