В этом ответе предполагается, что вы не можете поворачивать прямоугольники, а стороны всегда параллельны осям x и y.
Сначала найдите прямоугольник, охватывающий всю область.Алгоритм для этого выглядит следующим образом (при условии, что источник находится на вершине):
For each marked spot in the matrix:
if spot.x < rectangle.left:
rectangle.left = spot.x
if spot.x > rectangle.right:
rectangle.left = spot.x
if spot.y < rectangle.top:
rectangle.left = spot.x
if spot.y < rectangle.bottom:
rectangle.left = spot.x
Затем найдите самый большой горизонтальный разрыв, как этот:
largest_gap = -1
For each column in matrix:
last_marked_spot = 0, 0
For each spot in column:
if spot.marked:
if spot.x - last_marked_spot.x > largest_gap:
largest_gap = spot.x - last_marked_spot.x
last_marked_spot = spot
То же самое относится к вертикальному разрыву,Затем проверьте, какой зазор является наибольшим.
Затем разделите прямоугольник, состоящий из всех частей, на две части, используя самый большой зазор в качестве разделителя.Последний шаг - сворачивание двух прямоугольников (с использованием обратного алгоритма сверху).