队列训练:新兵出列算法详解及 Python 代码实现
队列训练:新兵出列算法详解及 Python 代码实现
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队。训练的规则如下:
- 从头开始 1 至 2 报数,凡报到 2 的出列,剩下的向小序号方向靠拢。
- 再从头开始进行 1 至 3 报数,凡报到 3 的出列,剩下的向小序号方向靠拢。
- 继续从头开始进行 1 至 2 报数······
- 以后从头开始轮流进行 1 至 2 报数、1 至 3 报数直到剩下的人数不超过三人为止。
输入
本题有多个测试数据组,第一行为组数 N,接着为 N 行新兵人数,新兵人数不超过 10000。
输出
共有 N 行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
使用 Python 的链表内容:
你可以使用 Python 的列表来实现链表。具体的实现思路如下:
- 首先根据输入的新兵人数创建一个初始编号列表,编号从 1 到新兵人数。
- 创建一个变量 count,初始化为 1,表示当前报数。
- 创建一个变量 index,初始化为 0,表示当前队列中人的索引。
- 创建一个空列表 result,用来存放剩下的新兵的最初编号。
- 使用 while 循环,直到队列中的人数不超过三人。
- 在循环中,根据 count 的值进行报数判断:
- 如果 count 为 2,则将队列中索引为 index 的人移出队列,并将 index 减 1。
- 如果 count 为 3,则将队列中索引为 index 的人移出队列,并将 index 减 1。
- 其他情况下,将 index 加 1,使队列向小序号方向靠拢。
- 将 count 加 1,如果 count 大于 3,则将 count 重置为 1。
- 循环结束后,将剩下的新兵最初的编号添加到 result 列表中。
- 输出 result 列表。
代码实现:
N = int(input()) # 输入测试数据组数
for _ in range(N):
num = int(input()) # 输入新兵人数
queue = list(range(1, num + 1)) # 创建初始编号列表
count = 1
index = 0
result = []
while len(queue) > 3:
if count == 2:
queue.pop(index)
index -= 1
elif count == 3:
queue.pop(index)
index -= 1
else:
index += 1
count += 1
if count > 3:
count = 1
result.extend(queue) # 将剩下的新兵最初的编号添加到 result 列表中
print(' '.join(map(str, result))) # 输出 result 列表
注意,这里使用了map(str, result)将 result 列表中的元素转换为字符串,然后使用' '.join()将它们连接起来,并以空格分隔。这样输出时,每个编号之间会有一个空格。
原文地址: https://www.cveoy.top/t/topic/qj8l 著作权归作者所有。请勿转载和采集!