Python 解答火车排序的问题:火车单向行驶:从左到右,一次标号每辆火车,入口出口只能被占用一次、那么如图所示。需要几列火车轨道满足要求?

Python 解答火车排序的问题:火车单向行驶:从左到右,一次标号每辆火车,入口出口只能被占用一次、那么如图所示。需要几列火车轨道满足要求?

我对这个题目做了一些补充,想要让随机排序的火车都能按顺序进入终点轨道:

'''

在一条只能从左往右通行的轨道上,排列了9辆火车,序号为1~9,它们的顺序是打乱的。现在这条轨

道的前方有一个轨道分叉点,分叉点分出n条轨道,可供火车单向行驶或暂时停放(停放数量最多为9辆)

,这n条轨道往右最后又合并到一条主轨道上,这条主轨道作为9辆火车的停放终点,但是要求火车在它上

面的停放序号的顺序从左到右为9~1,也就是小序号火车要先进终点轨道。

现在要求做出火车排列归家的程序,要求做到用到的n的数量尽量少(但是不要求用程序找出n的值)

,且火车只能往右行驶,一条轨道上面不能有超车操作。

并且开始轨道(bin)、中间轨道(list_n)、终点轨道(end)都用列表来表示

(最后测试例子bin = [7,6,1,9,3,5,2,4,8],要求end = [9,8,7,6,5,4,3,2,1],了解n的值是多少

'''

'''
完成时间:2019/4/1
csdn作者:peipei12138
'''
_str = input('请输入随机序列的9辆火车:')
bin = [int(i) for i in _str]                # 开始轨道上顺序打乱的火车
_list = [[] for i in range(9)]              # 最多安排9条用来排序的轨道
_end = []                                    # 终点停放

# list_into函数作用 送入函数当前进入的火车序号,查找排序轨道上是否有序号比它小1的火车
# 存在则将这条轨道序号返回,不存在则开辟一条新的排序轨道返回它的序号
def list_into(Nob):
    n = 0                                   # n用来记录当前遍历的排序轨道序号,并作为最后的返回值
    for listn in _list:                     # 遍历排序轨道,查找可以存放Nob火车的n轨道
        if listn == []: break
        else:
            if Nob - listn[0] == 1:
                return n
            n += 1
    return n

end_n = 1                                   # 最优先进end栈的火车,在list_out内进入end后,可以进行加1操作
# list_out函数作用 如果排序轨道上出现1,将1从排序轨道上送到终点end轨道上,然后1变为2,类推
def list_out():
    global end_n                            # 设置全局变量
    global _end
    for listn in _list:                     # 遍历排序轨道,查找最急切出队列的end_n
        if listn == []: continue
        elif listn[-1] == end_n:            # 查找到最急切出队的end_n
            while listn != []:              # 因为该队列火车是序号相邻排序的,所以将队列所有元素依次出队
                listn_out = listn.pop(-1)
                _end.insert(0, listn_out)    # 出队火车进入end终点轨道
                end_n += 1
            list_out()
        else: pass

while len(bin) != 0:
    bin_out = bin.pop(-1)                   # 出bin栈
    list_n = list_into(bin_out)             # 用list_into函数找到出栈火车要进入的排序轨道序号
    _list[list_n].insert(0,bin_out)         # 进_list[n]队列
    # print(_list)
    # a = input('>>>')
    list_out()                              # 用list_out函数将排序轨道上满足条件的火车送到终点end轨道上
    # print(_list)
    # a = input('>>>')

print('停放站内火车是否按从9~1的顺序停放?:', _end == [9,8,7,6,5,4,3,2,1])
    

这个题实际上就是从一个栈到多个队列,通过进入不同的队列,和在对列上的停留对火车进行排序,然后再到同一个终点栈。

bin列表唯一的操作为:bin.pop(-1) 即为开始轨道的出栈操作

_list列表包含多个排序队列,它们的唯二操作为:.insert(0, bin_out) 和 .pop(-1) 即为排序轨道的入队和出队操作

_end列表唯一的操作为:_end.insert(0, listn_out) 即为终点轨道的入栈操作

 

 

 

供初学者参考