77 火车进站

题目描述
给定一个正整数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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值