题目描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。
输入描述:
有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。
输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
示例1
输入
3
1 2 3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
此处所谓字典序排序的意思是这n辆火车有多少种出站的可能顺序(也就是数据结构中的栈有多少种出栈顺序)。
思路为用三个变量分别存储待进站火车,站中火车和已出站火车,其中待进站火车用Queue(队列)存储和站中
火车采用stack(栈)存储,已出站火车采用StringBuilder来存储,具体实现是采用递归的方法,递归函数的参数为当前待进站火车、站中火车、已出站火车的值所组成的三元组,递归结束条件是,未进站火车和站中火车均为空,此时输出已出站火车即为所有出站的一种可能,递推关系为对于当前情况有让下一辆火车进站或让站 中的一辆火车出站两种可能,对于两种可能分别调用递归函数,即可得出问题的解。
def handle(prestation,instation,outstation):
if not prestation and not instation:#全部出栈
result.append(' '.join(outstation))
if instation:#先出栈
temp_pre=prestation[:]
temp_in=instation[:]
temp_out=outstation[:]
temp_out.append(temp_in.pop())
handle(temp_pre,temp_in,temp_out)
if prestation:#再入栈
temp_pre = prestation[:]
temp_in = instation[:]
temp_out = outstation[:]
temp_in.append(temp_pre.pop(0))
handle(temp_pre,temp_in,temp_out)
return result
while True:
try:
m=int(input())
prestation=input().split()
instation=[]
outstation=[]
result=[]
handle(prestation,instation,outstation)
result.sort()#按字典序输出
for i in result:
print(i)
except:
break