Поскольку существует только четыре прямоугольника, перечисление всех возможных макетов должно работать.
Конечно, на самом деле все возможные макеты - это слишком много, но мы можем объединить эквивалентные макеты.
Давайте рассмотрим только макеты, в которых каждый прямоугольник нельзя перемещать влево и вверх. Это означает, что его верхняя граница касается чего-то, а его левая граница касается чего-то. Все остальные макеты могут быть преобразованы в такое подмножество без увеличения ограничительной рамки.
Когда мы выбираем первый прямоугольник (один из четырех), он может касаться только левой и верхней границ ограничительной рамки, поэтому у нас есть только одна возможная позиция для его левой верхней вершины.
Когда мы выбираем второй прямоугольник (один из трех), его верхняя граница может касаться либо верхней границы ограничивающего прямоугольника, либо нижней границы первого прямоугольника - 2 варианта. Точно так же его левая граница может касаться либо левой границы ограничительной рамки, либо правой границы первого прямоугольника - еще 2 варианта. Таким образом, мы получаем 2x2 = 4 варианта координаты его левой верхней вершины.
И так далее для третьего и четвертого прямоугольника.
Конечно, на каждом шаге мы должны проверять, нет ли пересечения между прямоугольниками (например, если оба они начнутся из левого верхнего угла ограничительной рамки). Также иногда мы получим явно неоптимальные макеты (например, когда вершина левого верхнего угла второго прямоугольника совпадает с вершинами правого нижнего угла первого), но это не повредит результату и может быть удалено, если решение недостаточно быстрое .