进出栈序列问题
背景
这里有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;
}
    注:转载请注明出处
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号