адача 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 году и довольно часто и неожиданно возникают при решении разных задач, которые на первый взгляд мало связаны между собой.