卡特兰数------2行n列排队问题

一、Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数)

问题描述:
2n个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
#include <iostream.h>

int count = 0; //计数器

/**************输出数组***********/
void Print(int a[], int b[],int n)
{
	for (int j = 0; j < n/2; j++)	
	{
		cout<<a[j]<<"   ";
	}
	cout<<endl;
	for (j = 0; j < n/2; j++)
	{
		cout<<b[j]<<"   ";
	}
	cout<<endl<<endl;
}

void Cattleya(int up, int down,int x, int n,int a[], int b[])//up down 分别表示上下数组已填的个数,x表示要填的数 
{																		//a[]  b[]  表示上下数组
	if (up == n/2) //当上数组填满时找到一种情况
	{
		for (int w = down; w < n/2; w++)		//当上数组确定,下数组也确定,填充下数组
		{
			b[w] = n/2+w+1;
		}
		count++;
		Print(a,b,n);//输出结果
		return ;
	}
	if (up == down)	//上下数组已填个数相等时 填上数组
	{	
		a[up] = x+1;
		Cattleya(up+1, down, x+1,n,a,b);

	}
	else
	{
		a[up] = x+1;
		Cattleya(up+1, down, x+1,n,a,b);
		b[down] = x+1;
		Cattleya(up, down+1, x+1,n,a,b);

	}
}

void main()
{
	int n; 
	cout<<"请输入n的大小:";
	cin>>n;
	int *a = new int(n);
	int *b = new int(n);
	Cattleya(0,0,0,n*2,a,b);
	cout<<"一共有"<<count<<"种解法!"<<endl;
}


猜你喜欢

转载自blog.csdn.net/weixin_37267014/article/details/78393503