题目描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。
输入描述:
有多组测试用例,每一组第一行输入一个正整数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
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<string> sres;//题目中结果是按升序排的。
vector<int> vi;//逆序存放输入元素,从后往前删除来模拟元素的正序进栈
vector<int> res;//当作结果容器来用
vector<int> si;//当作栈来用
void find(){
if(vi.size()==0){
//输出res,出栈
//将si中元素逆序放入到res中
//
// int i=0;
// if(!res.empty()){
// for(i=0;i<res.size()-1;i++)
// cout<<res[i]<<" ";
// if(i==n-1){
// cout<<res[i]<<endl;
// return ;
// }
// else
// cout<<res[i]<<" ";
// }
// if(!si.empty()){
// for(i=si.size()-1;i>0;i--)
// cout<<si[i]<<" ";
// cout<<si[0]<<endl;
// }
// return ;
string s;
for(auto i:res)
s+=to_string(i);
for(int i=si.size()-1;i>=0;i--)
s+=to_string(si[i]);
sres.push_back(s);
return ;
}
if(!si.empty()){
//出栈
res.push_back(si.back());
si.pop_back();
find();
//恢复
si.push_back(res.back());
res.pop_back();
}
if(vi.size()>0){
//入栈
si.push_back(vi.back());
vi.pop_back();
find();
//恢复
vi.push_back(si.back());
si.pop_back();
}
}
int main(){
int temp;
while(cin>>n){
vi.clear();
res.clear();
si.clear();
sres.clear();
for(int i=0;i<n;i++){
cin>>temp;
vi.insert(vi.begin(),temp);
}
find();
sort(sres.begin(),sres.end());
for(auto s:sres){
for(int i=0;i<n-1;i++)
cout<<s[i]<<" ";
cout<<s[n-1]<<endl;
}
}
return 0;
}