【Python通过缓冲轨中转实现火车按序出轨】

一、题目

       一列货运列车有 n 节车厢,每节车厢将停放在不同车站。假定 n 个车站的编号分别为 1~ n,车按照第 n 站至第1站的顺序停靠车厢编号与目的站序号相同。为了到每个站时只需卸掉最后一节车厢,必须将任意次序的车厢进行重排使得各车厢从前往后的编号是1~n。重排车厢的工作在一个转轨站里完成,如第 15 题图所示在转轨站中有一个入轨,一个出轨和 k(k =3)个缓冲轨H1、H2、H3。开始时n节车厢从入轨处进入转轨站转轨,结束后车厢按编号1~n的次序离开转轨站。
编写程序模拟有 n(n=9)节车厢的“入轨”和“出轨”过程(入轨车厢次序满足缓冲轨为3的情况)。车厢可以从入轨的前部移动到一个缓冲轨的顶部或者是出轨处的后部。

进入缓冲轨的车厢编号要满足:

1、小于要进入的缓冲轨的栈顶元素编号。

2、满足条件D里面栈顶元素编号最小的缓冲轨。

3、若没有满足条件D的缓冲轨,则进人空的缓冲轨。

二、代码实现
# 将车厢移到缓冲轨处
def inputStack(bh, stacks, n):
    global minNum, minStack, k
    bestStack = -1  # bestStack 记录最小车厢编号所在的缓冲轨编号
    bestTop = n + 1  # bestTop 记录缓冲轨中的最小车厢编号
    k = 3
    minNum = -1
    minStack = -1
    for i in range(k):
        if len(stacks[i]) > 0:
            top = stacks[i][-1]
            if bestTop > top > bh:
                bestTop = top
                bestStack = i
        else:
            if bestStack == -1:
                bestStack = i
    if bestStack == -1:
        return False
    stacks[bestStack].append(bh)
    print("将%d 号车厢从入轨处移到缓冲轨道 H%d 处。" % (bh, bestStack + 1))
    if bh < minNum:
        minNum = bh
        minStack = bestStack
    return True


def output(stacks, curBh):
    # 将缓冲轨中的剩余车厢按顺序依次移到出轨处
    for i in range(3):
        if len(stacks[i]) > 0 and stacks[i][-1] == curBh:
            print("将%d 号车厢从缓冲轨道 H%d 移到出车处。" % (stacks[i][-1], i + 1))
            stacks[i].pop()
            break

# 主函数
def huancunSort():
    list = [3, 6, 9, 2, 4, 7, 1, 8, 5]
    # 车厢的原始编号存放在列表list中
    n = len(list)
    k = 3
    hStacks = [[] for i in range(k)]
    curBH = 1
    minStack = -1
    print("车厢重排过程如下:")
    i = 0
    while i < n:
        if list[i] == curBH:
            print("将%d 号车厢从入轨处直接移到出轨处" %list[i])
            curBH += 1
            i += 1
            continue
        while True:
            minNum = n + 1
            for j in range(k):
                if len(hStacks[j]) > 0:
                    if hStacks[j][-1] < minNum:
                        minNum = hStacks[j][-1]
                        minStack = j
            if minNum == curBH:
                print("将%d 号车厢从缓冲轨道 H%d 移到出车处。" % (minNum, minStack + 1))
                hStacks[minStack].pop()
                curBH += 1
            else:
                inputStack(list[i], hStacks, n)
                i += 1
                break
    while curBH < n + 1:
        output(hStacks, curBH)
        curBH += 1
    print("完成车厢重排!")

三、可优化点

1、缓存轨道数目不固定:该题目序列顺序可使用3个缓存轨道做中转完成火车出轨,如果序列换成[3, 6, 9, 2, 4, 7, 8, 1, 5],3个缓存轨道则不够,需要增加缓存轨道。

2、待定...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值