背景
这里有n列火车将要进站再出站……
但是,每列火车只有1节---那就是车头……
描述
有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
(某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站?
老师:闭嘴!)
就像这样:
出站<——- <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前20种可能的出栈方案。
输入格式
一个整数 n<=20
输出格式
按照《字典序》输出前20种答案,每行一种,不要空格
样例输入
3
样例输出
123
132
213
231
321
- 每次访问只有出栈或者进栈两种选择
- 每次操作之后进行下一次搜索,但是搜索完成之后要及时消除影响
int k=0;
int n;
int len=1,a[21];
void dfs(stack<int> s,int num)
{
if(k==20)
return;
if(num==n+1)
{
for(int i=1;i<len;i++)cout<<a[i];
while(!s.empty())
{
cout<<s.top();
s.pop();
}
cout<<endl;
k++;
return;
}
if(!s.empty())
{
a[len++] = s.top(),s.pop();
dfs(s,num);
s.push(a[--len]);
}
s.push(num);
dfs(s,num+1);
}
int main()
{
cin>>n;
stack<int> s;
dfs(s,1);
return 0;
}