Статья Автор: Лебедев Дмитрий

TUZ_2-15 Разрезание прямоугольника на квадраты

TUZ_2-15 Разрезание прямоугольника на квадраты

TUZ_2-15 Разрезание прямоугольника на квадраты
Дан кортеж (a, b), представляющий длину и ширину прямоугольника соответственно.
Ваша задача: написать функцию, которая принимает кортеж (a, b) и возвращает минимальное количество резов,
которые необходимо сделать, чтобы из прямоугольника получить несколько квадратов.
В табл. 2.15 показаны ожидаемые результаты для некоторых входных данных.
Таблица 2.15. Некоторые ожидаемые результаты для задачи разрезания прямоугольника на квадраты
a, b Ожидаемый результат
7, 7 0
17, 10 6
5, 3 3
7, 9 5

Алгоритм
.Лучше всего для решения этой задачи подходит рекурсивная функция.
Цель алгоритма состоит в том, чтобы определить минимальное количество резов, необходимых для разрезания заданного прямоугольника на квадраты. Для достижения этой цели алгоритм начинается с проверки, является ли данный прямоугольник квадратом. Если заданный прямоугольник уже является квадратом, то алгоритм возвращает 0. Однако если прямоугольник не является квадратом, то алгоритм рекурсивно делит его на меньшие прямоугольники-квадраты, пока не достигнет желаемого результата. В этом процессе используется мемоизация для хранения ранее вычисленных результатов, чтобы избежать избыточных вычислений. После преобразования всех прямоугольников в квадраты алгоритм сравнивает результаты, полученные при разрезании конечного квадрата как по горизонтали, так и по вертикали. Затем выбирает решение с минимальным количеством резов, запоминает результат и возвращает его.
Алгоритм выполняет следующие шаги.
1. Принимает a (длина) и b (ширина).
2. Создается словарь memo для хранения значений.
3. Проверяется равенство a и b. Если они равны, то возвращается 0, по- скольку прямоугольник уже является квадратом и резать его не требуется.
4. Проверяется равенство a или b значению 1. Если a или b равно 1, то возвращается максимальное значение из a и b минус 1, поскольку в этом случае может быть только один квадрат.
5. Создается ключ в форме кортежа (a, b), и проверяется, присутствует ли этот ключ в словаре memo. Если ключ существует, то возвращается его значение. 6. Переменная answer инициализируется значением (a – 1) * b.
7. Выполняется цикл (с переменной цикла i) по диапазону значений от 1 до a//2 + 1.
8. Выбирается минимальное значение из answer и (a – i, b, memo) плюс (i, b, memo) плюс 1.
9. Выполняется цикл (с переменной цикла i) по диапазону значений от 1 до b//2 + 1.
10. Выбирается минимальное значение из answer и (a, b – i, memo) плюс (a, i, memo) плюс 1.
11. В словарь memo добавляется пара ключ-значение.
12. Возвращается ответ. 

Предлагаемый алгоритм не является эффективным и работает при небольших значениях a, b. 
Очень быстро возникает ограничение на глубину рекурсии


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать