Я бы подошел к нему по рекурсии.
Напишите функцию, которая получает два целочисленных значения в качестве входных данных.Одно значение будет длиной, а другое - шириной.Самая большая площадь, в которую вы можете поместиться, будет основана на самой короткой стороне.Его размеры будут рассчитываться следующим образом:
2^RoundDown(Log(ShortSide,Base:2))
Это даст вам ваш первый квадрат и разделит прямоугольник либо на 3, либо на 1 другой прямоугольник, или ничего, если он квадрат с 2 ^ n длинами сторон.
Размеры остальных прямоугольников легко получить простым вычитанием.После того, как размеры вычислены, вызовите функцию снова (внутри себя) для каждого нового прямоугольника с его размерами.
Функция должна быть прекращена, когда разности, рассчитанные для обеих сторон, равны нулю, т.е.n длины сторон.
Немного похоже на это:
Global int Counter
DivideRectangle(int Width, int Length)
int BigSquare = 2^RoundDown(Log(Width,Base:2))
if NOT(Width - BigSqaure = 0 AND Height- BigSqaure = 0)
DivideRectangle(width - BigSquare, Height - BigSquare)
DivideRectangle(width - BigSquare, BigSquare)
DivideRectangle(BigSquare, Height - BigSquare)
Counter += 1
Это примерно так;Счетчик, возвращаемый после всей операции, представляет собой число квадратов для заполнения прямоугольника.Очевидно, что код несовершенен и требует доработки, но это всего лишь набросок того, что должно произойти.
Надеюсь, это поможет