描述 | 给定一个正整数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;
}