http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282ios
給定一個正整數N表明火車數量,0<N<10,接下來輸入火車入站的序列,一共N輛火車,每輛火車以數字1-9編號。要求以字典序排序輸出火車出站的序列號。其實也就是輸出全部可能的出棧序列。ide
樣例輸入:spa
3code
1 2 3blog
樣例輸出:排序
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1遞歸
解答:隊列
其實核心就是一個棧,對於第K個數,在第K個數進棧以前,前面的 K-1 個數要麼所有出去了,要麼都在棧裏面,要麼部分在棧裏面部分出去了。那麼能夠假想,在第K個數入棧以前,依次從棧裏面出去 0個、1個、2個……棧.size()個,而後把第K個入棧,再對於 K+1個一樣實施這樣的方法——這就是個遞歸了。ci
出去了的保存在一個隊列裏面,沒出站的保存在棧裏面,最後一輛車處理完了遞歸結束並輸出。get
代碼:
1 #include <iostream> 2 #include <vector> 3 #include <stack> 4 5 using namespace std; 6 7 #define DEBUG 8 9 int n = 0; 10 int* pArr = NULL; 11 12 void handle(const int index, stack<int> s, vector<int> v) 13 { 14 //對於每個待處理的數字,先處理棧裏面的,再處理這個數字 15 for (int i = s.size(); i >=0; i--) 16 { 17 //棧裏面的數字能夠出來 [0個, 所有],出來的就放到了vector裏面待輸出了 18 stack<int> sTemp(s); 19 vector<int>vTemp(v); 20 21 //從棧裏面出 i 個到隊列裏面去 22 for (int j = 1; j <= i; j++) 23 { 24 int top = sTemp.top(); 25 sTemp.pop(); 26 vTemp.push_back(top); 27 } 28 29 //再處理這個,把它放到棧頂 30 sTemp.push(pArr[index]); 31 32 if (n - 1 == index) 33 { 34 //輸出結果 35 static bool isFirst = true; 36 vector<int> vRes; 37 if (!isFirst) 38 cout << endl; 39 40 for (int i = 0; i < vTemp.size(); i++) 41 vRes.push_back(vTemp[i]); 42 43 while (!sTemp.empty()) 44 { 45 int top = sTemp.top(); 46 sTemp.pop(); 47 vRes.push_back(top); 48 } 49 50 int i = 0; 51 for (i = 0; i < vRes.size() - 1; i++) 52 cout << vRes[i] << " "; 53 cout << vRes[i]; 54 isFirst = false; 55 } 56 else 57 { 58 //遞歸處理 59 handle(index + 1, sTemp, vTemp); 60 } 61 } 62 } 63 64 int main(void) 65 { 66 cin >> n; 67 pArr = new int[n]; 68 69 for (int i = 0; i < n; i++) 70 cin >> pArr[i]; 71 72 stack<int> s; 73 vector<int> v; 74 handle(0, s, v); 75 76 delete[] pArr; 77 78 #ifdef DEBUG 79 while (true) 80 cin.get(); 81 #endif 82 }
第3五、36行的變量只是爲了輸出格式。
總結:
相似於這種的題目有時候只要根據它的狀況模擬一下就知道解決思路了。