一、题目
一列货运列车有 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、待定...