#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,m,j;
int a[1000],stack[1000],result[1000];
int check()
{
int j1,j2,k,i,flag=1;
j1=k=j2=i=0;
do
{
i+=1;
if(a[i])
{
k++,j1++,stack[j1]=k;
}
else
{
if(j1<1)flag=0;
else
{
j2++,result[j2]=stack[j1],j1--;
}
}
}while(i<2*n&&flag);
if(j1==0&&flag)
{
m++;
for(i=1;i<=j2;i++)
{
if(i!=1)printf(" ");
printf("%d",result[i]);
}
puts("");
}
}
int main()
{
int i;
while(~scanf("%d",&n))
{
m=0;
if(n!=0)
{
for(i=1;i<2*n;i++)a[i]=1;
do
{
check();
j=2*n;
a[j]=a[j]-1;
while(a[j]<0&&j>1)
{
a[j]=1;
j--;
a[j]=a[j]-1;
}
}while(a[1]!=-1);
}
printf("%d\n",m);
}
return 0;
}
算法思想:设初始数组a,a[i]=0表示出栈操作,a[i]=1表示入栈操作,每列火车用数组a的
两个元素表示该列火车出入栈情况,即n列火车的出站序列由数组a的各元素的0、1组合确定;
程序给出2n个元素的所有0、1组合,对每一种组合用栈的先进后出原则进行测试,若符合,则
输出该种组合所对应的火车出站序列。