火车进栈(进出栈的模拟,dfs爆搜)

这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。

这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。

也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。

车站示意如图:

            出站<——    <——进站
                     |车|
                     |站|
                     |__|

现在请你按《字典序》输出前20种可能的出栈方案。

输入格式

输入一个整数n,代表火车数量。

输出格式

按照《字典序》输出前20种答案,每行一种,不要空格。

数据范围

1n201≤n≤20

输入样例:

3

输出样例:

123
132
213
231
321
代码如下:
#include<bits/stdc++.h>
using namespace std;
int q[30],p[30];
int n,k=0,tot=0,st=0;
void dfs(int step)
{
    if(step==n+1)
    {
        if(k>=20)return;
        for(int i=1;i<=st;i++)
            printf("%d",q[i]);
        for(int i=tot;i>0;i--)
            printf("%d",p[i]);
        printf("\n");
        k++;
        return;
    }
   if(tot)//先考虑出栈
   {
       q[++st]=p[tot--];
       dfs(step);
       p[++tot]=q[st--];
   }
   p[++tot]=step;//入栈
   dfs(step+1);
   tot--;
    return;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/chuliyou/p/12692614.html