1. 程式人生 > >從一道騰訊演算法題到一種遞迴形式

從一道騰訊演算法題到一種遞迴形式

演算法題目:

12個高矮不同的人排兩行,一行六人,在保證每行從左到右依次增高,每列從前到後依次增高的前提下,一共有多少種排法?

思路:

我們用陣列來表示這兩排人:


假設高矮不同的12個人我們分別用0~11來表示。

通過簡單的思考,我們可以斷定:前排的最左邊應該為0,後排的最右邊應該是11,即:


在接下來我們可以通過列舉一些例子來搞清楚這個陣列的排列規律,

我們發現前排0的右邊最大可能的數字是2(<3),再往右邊最大可能的數字是4(<5),

接下來再往右分別是6(-7),8(<9),10(<11)。即:


然後我們發現只要前排的數字都確定後,後排的數字的順序其實已經唯一。

下面是程式實現的原始碼:

#include <iostream>

#define NUM 12
using namespace std;

int haha = 0;
int people[12] = {0};//表示12個位子,儲存的值為該位子坐的是哪個高度(0~11)的人
int all[12] = {0};//表示12個人,儲存的值若為1,則此人在前排;若為0,則此人在後排

void twelvepeople(int index , int FirstNum)
{
	if(index == 6)
	{
		for(int i = 0;i< 6;i++)
			cout <<setw(4)<< people[i];
		cout << endl;
		for(int i = 0;i< 12;i++)
			if(all[i] == 0)
				cout <<setw(4)<< i;
		cout << endl;
		cout << endl;
		haha++;
		return;
	}
	for(int i=FirstNum;i < index*2+1 ;i++)
	{
		people[index] = i;
		all[i] = 1;
		twelvepeople(index+1 , i+1);
		all[i] = 0;
	}
}

int main()
{
	twelvepeople(0 , 0);
	cout << "組合個數為:"<<haha << endl;
	return 0;
}

下面是執行結果: