火车进站
描述 |
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。 |
---|---|
知识点 | 栈 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 |
有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。 |
输出 |
输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。 |
样例输入 | 3 1 2 3 |
样例输出 |
1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 |
隐含条件,这个题目中的火车站是个栈,前面的没出站,后面的来了的话,就把前面的堵在里面了。
仔细思考几个回合,即可发现其中规律。
本题用dfs解决,代码如下:
#include<iostream> #include<stack> #include<vector> #include<string> #include<algorithm> using namespace std; void display(vector<int> arr) { for(unsigned int i=0; i<arr.size()-1; i++) { cout<<arr[i]<<' '; } cout<<arr[arr.size()-1]<<endl; } bool comp12(vector<int> v1, vector<int> v2) { int n= v1.size(); for(int i=0; i<n; i++) { if(v1[i]!=v2[i]) { return v1[i]<v2[i]; } } return true; } void solve(int count, int *input, int N, stack<int> &stk, vector<int> &arr, vector<vector<int> > &arrs) { if(count==N-1) { //the last arr.push_back(input[count]); int stksz = stk.size(); while(!stk.empty()) { int tmp = stk.top(); stk.pop(); arr.push_back(tmp); } arrs.push_back(arr); for(int i=0; i<stksz; i++) { int tmp = arr.back(); stk.push(tmp); arr.pop_back(); } arr.pop_back();//pop the last } else { stk.push(input[count]); int stksize = stk.size(); //cout<<"size"<<stksize<<endl; for(int i=0; i<=stksize; i++) { //cout<<"x"<<i<<endl; for(int j=0; j<i; j++) { int tmp = stk.top(); //cout<<"top"<<tmp<<endl; stk.pop(); arr.push_back(tmp); } solve(count+1, input ,N,stk, arr, arrs); for(int j=0; j<i; j++) { int tmp = arr.back(); stk.push(tmp); arr.pop_back(); } } stk.pop(); } } int main() { int N; cin>>N; int *input; input = new int [N]; for(int i=0; i<N; i++) { cin>>input[i]; } int count = 0; stack<int> stk; vector<int> arr; vector<vector<int> > arrs; solve(count, input, N, stk, arr, arrs); sort(arrs.begin(), arrs.end(), comp12); for(unsigned int i=0; i<arrs.size(); i++) { display(arrs[i]); } delete [] input; return 0; }