Рекурсивная функция генерации скобочных выражений
Одна из основных идей, использумых при решении задачи, это погружение задачи в двухпараметрическое множество задач.
Вместо однопараметрической задачи задачи
Генерация скобочных выражений длины n.
мы переходим к двухпараметрической задаче
Генерация скбочных выражений длины n, которые имеют k лишних закрывающихся скобок (то есть являются правильными, если к ним в начало приписать k открывающихся скобок).
Назовём такие выражения выражениями типа (n,k).
Выражения типа (2n, 0) это правильные скобочные выражения из n пар скобок.
#include<stdio.h>
/* В этот массив мы будем помещать символы скобочного выражения, которое мы конструируем
*/
char expr[100];
/* индекс ячейки в массиве expr, куда нужно поместить следующий символ
*/
int pt = 0;
/* Вывести значение полученного скобочного выражения в станлартный поток вывода
*/
void print_expr() {
expr[pt] = 0;
printf("%s\n", expr);
}
/* Сгенерировать в ячейки expr[pt], expr[pt+1], .. expr[pt+n-1] все возможные варианты
* скобочных выражений типа (n,k).
*/
void gen (int n, int k) {
if (n == 0) {
print_expr();
} else {
if (n-1 >= k+1) {
expr [pt] = '('; pt++;
gen(n-1, k+1); pt--;
}
if ( k > 0 ) {
expr[pt] = ')'; pt++;
gen(n-1, k-1); pt--;
}
}
}
int main () {
int n;
scanf("%d", &n); // считываем
gen(2*n, 0); // выводим все правильные скобочныевыражения из n пар скобок
return 0;
}
--
ArtemVoroztsov - 17 Sep 2007