Разбиение выпуклого многоугольника
Back Home Up Next

адача 44. Разбиение многоугольника. Написать рекурсивную программу-функцию, подсчитывающую количество способов разбиения выпуклого многоугольника на треугольники непересекающимися диагоналями.

Решение. Пусть задан произвольный выпуклый n-угольник M(n) с вершинами, последовательно именованными против часовой стрелки от M1 до Mn включительно. Обозначим через gn искомое число разбиений M(n) на треугольники.

1. Рассмотрим (n+1)-угольник M(n+1) c вершинами Mk (k = 1, 2, ..., n+1) и зафиксируем одну из его сторон, например M1M2 . При любом разбиении M(n+1) найдется треугольник M1M2Mk, содержащий эту сторону. Возможны лишь три случая (см. рис. 10): Mk - вершина, соседняя с M1 (k=n+1): Mk- вершина, соседняя с M2 (k=3); Mk не является соседней вершиной ни с M1, ни с M2 (k=4, 5, …, n). Каждый случай разберем отдельно.

Рис. 10.  Возможные типы треугольников со стороной M1M2.

A.  Mk - вершина, соседняя с M1 (k = n+1). Если из M(n+1) удалить треугольник M1M2Mk, то получим некоторый n-угольник, для которого, по предположению, существует gn разбиений. Поэтому столько же разбиений будет существовать и для M(n+1).

B.  Mk - вершина, соседняя с M2 (k = 3). Разбор проводится аналогично предыдущему случаю.

C.  Mk не является соседней вершиной ни с M1, ни с M2 (k = 4, 5, ..., n). Треугольник M1M2Mk разделяет M(n+1) на три части: сам M1M2Mk, (k-1)-угольник и (n-k+3)-угольник. Две последние из них примыкают к сторонам треугольника M1M2Mk и, по предположению, разбиваются на треугольники соответственно gk-1 и gn-k+3 способами. Следовательно, для данного k это дает gk-1×gn-k+3 способов разбиения M(n+1).

Учитывая подсчеты, проведенные в пунктах A, B и C, получаем:

                                                                 (19)

 В принципе, рекуррентная формула (19) уже пригодна для нахождения решений задачи: g3 = 1, g4 = 2, g5 = 5, g6 = 14 ... . Она же может служить основой и для составления соответствующей рекурсивной функции g(n). Но вычисления по такой функции g(n) будут неэффективны. Поэтому продолжим наши рассуждения, стараясь, по возможности, упростить (19).

2. Покажем, что число диагоналей, участвующих в любом конкретном разбиении многоугольника M(n), не связано со способом его разбиения и всегда равно n-3. Действительно, при любом разбиении образуется (n-2) треугольников. Число их сторон равно 3×(n-2). Если отсюда вычесть n (количество сторон M(n)) и учесть, что каждая диагональ - общая сторона двух соседних треугольников, то общее количество диагоналей разбиения будет равно (3×(n-2)-n)/2=n-3.

3. Пусть вершины M1 и M2 сливаются. При этом (n+1)-угольник превращается в n-угольник, а треугольник M1M2Mk - в отрезок: в сторону - для случаев A и B и в диагональ - для случая C. Теперь сумма слагаемых правой части (19), не считая 2×gn, выражает число всех разбиений M(n), в которых участвует какая-либо диагональ, проходящая через фиксированную вершину (M1=M2). Сумма этих сумм по каждой из вершин дает значение Как это выражение связано с gn? Во-первых, в нем каждая диагональ, проходя через две вершины, учтена дважды, а во-вторых, каждое разбиение M(n) подсчитано столько раз, сколько диагоналей участвует в этом разбиении, то есть n-3. Следовательно,

 

Из данного соотношения и (16) получаем:

Эту рекуррентную формулу уже вполне можно использовать для составления рекурсивной программы-функции g(n) решения задачи. Выглядеть она может, например, так:

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

 g(4) = 2,        g(5) = 5,        g(6) = 14,        g(10) = 1430,       

 g(20) = 477638700,           g(30) = 263747951750360.        

Замечание. Из выведенного ранее рекуррентного соотношения для gn+1 достаточно просто получить и конечную формулу:

 

                

Значения gn, получаемые по этой формуле, называются числами Каталана. Впервые они появились в исследованиях Э. Каталана в 1838 году и довольно часто и неожиданно возникают при решении разных задач, которые на первый взгляд мало связаны между собой.

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