这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。
这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。
车站示意如图:
出站<—— <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前20种可能的出栈方案。
输入格式
输入一个整数n,代表火车数量。
输出格式
按照《字典序》输出前20种答案,每行一种,不要空格。
数据范围
1≤n≤20
输入样例:
3
输出样例:
123
132
213
231
321
思路分析
按照题目意思模拟即可,出站后的车用一个栈来存(更加合适的应该是一个数组或vector),车站内的车用一个栈来存,未进站的车用一个变量来存。
每次dfs有两种情况,一种是未进站的车进站(外边有车的前提下),一种是站内的车出站(站内有车的前提下),为了保证字典序,所以先考虑出栈。
当出来的车的总数等于n的时候,就可以把他们输出出来了。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
int s1[maxn],t1;
int s2[maxn],t2;
int n,s3=1,cnt=20;
void dfs(){//当前已经进了x
if(!cnt)
return;
if(t1==n){
for(int i=1;i<t1;i++)
cout<<s1[i];
cout<<s1[t1]<<endl;
cnt--;
return;
}
//出栈
if(t2>0){
s1[++t1]=s2[t2--];
dfs();
s2[++t2]=s1[t1--];
}
//进栈
if(s3<=n){
s2[++t2]=s3++;
dfs();
s3--;
t2--;
}
}
int main(){
scanf("%d",&n);
dfs();
return 0;
}