卡特蘭數------2行n列排隊問題
阿新 • • 發佈:2019-01-27
一、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; }