從一道騰訊演算法題到一種遞迴形式
阿新 • • 發佈:2019-01-28
演算法題目:
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; }
下面是執行結果: