1. 程式人生 > >卡特蘭數------2行n列排隊問題

卡特蘭數------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;
}