Разрезание прямоугольника на квадраты
Back Home Up

адача 41. Дан прямоугольник, длины сторон которого a и b представляют собой натуральные числа. Составить рекурсивную программу-функцию, подсчитывающую, на сколько квадратов с натуральными длинами сторон можно разрезать исходный прямоугольник, если каждый раз от него отрезать квадрат максимально возможной площади.

Решение. На рис.8 приведен пример разрезания прямоугольника размером 13´5 (a=13, b=5) на требуемые квадраты. В данном случае их оказалось 6. Ясен и рекурсивный алгоритм решения задачи. Пусть, например, a>b. Тогда отрезав от прямоугольника floor(a/b) квадратов со сторонами длиной b, снова окажемся перед исходной задачей, в которой a=b и b=mod(a,b) (b=a-floor(a/b)×b) .

 

Рис. 9. Пример разрезания прямоугольника 13´5 на квадраты

В качестве базы рекурсии можно взять случай b=0. Если numsq(a,b) - функция, возвращающая решение задачи при заданных длинах a и b (b¹0) сторон исходного прямоугольника, то в любом случае имеем декомпозицию

 Отсюда окончательно получаем:

 

Контрольные примеры:  numsq(13, 5) = 6,     numsq(5, 13) = 6.

 Пусть в качестве решения задачи требуется выдать не только количество получающихся квадратов, но и размеры каждого из них. Более точно, должен быть возвращен двумерный массив ma[i,j] (i=0,1, ..., k; j=0, 1), где ma[i,0] - длина стороны очередного квадрата, а ma[i,1] - количества квадратов со стороной ma[i,0]. Соответствующая рекурсивная программа-функция могла бы выглядеть так:

 

Контрольный пример:

Заметим, что nums(a,b) всегда возвращает матрицу, в последней строке которой находятся нули.

Home Содержание Схемы ООД Доска объявлений Поиск