递归/栈——火车进站

描述

火车站一共有 n 辆火车需要入站,每辆火车有一个编号,编号为 1 到 n。
同时,也有火车需要出站,由于火车站进出共享一个轨道,所以后入站的火车需要先出站。换句话说,对于某一辆火车,只有在它之后入站的火车都出站了,它才能出站。

现在,已经知道了火车的入站顺序,你需要计算,一共有多少种不同的出站顺序。按照字典序从小到大依次输出全部的出站顺序。

输入描述:

第一行输入一个整数 n(1≦n≦10) 代表火车的数量。
第二行输入 n个整数 a1​,a2​,…,an​(1≦ai​≦n) 代表火车的入站顺序。

输出描述:

输出若干行,每行输出 n 个整数,代表一种出站顺序。你需要按照字典序从小到大依次输出。

结果:

n = int(input())

ai = list(map(int,input().split()))

result = []#存放所有可能的出栈序列

#出栈排列,in_stack:代表已经在站内的车,out_queue:存放出站的车,index:当前处理的车在ai里面的序号

def dfs(in_stack,out_queue,index):

    #如果所有的车都已经出站,则将序列加入结果

    if len(out_queue)==n:

        result.append(tuple(out_queue))

        return

    #入站

    if index<n:

        dfs(in_stack+[ai[index]],out_queue,index+1)

    #出站

    if in_stack:

        dfs(in_stack[:-1],out_queue+[in_stack[-1]],index)

#初始化启动函数

dfs([],[],0)

for seq in sorted(result):

    print(' '.join(map(str,seq)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值