进出栈序列问题

背景

这里有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;
}
posted @ 2018-08-14 17:13  kpole  阅读(806)  评论(0编辑  收藏  举报