又见约瑟夫环:有M个人围坐成一圈, 编号依次从1开始递增直到M,现从编号为1的人开始报数,报到N的人出列,然后再从下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列。所有出列的人再次按出列顺序围坐成一圈,并从第1人开始报数,这次为报到K的人出队列,然后再从下一人开始重新报数,报到K的人出列;重复这一过程,直至所有人出列。求最后出列次序。题目输入包括M、N、K三个正整数;N、K可能为1。题目要求按最后出队列顺序输出他们的编号,每个测试用例结果占一行,每个编号占4位。
时间: 2024-03-13 14:45:44 浏览: 138
这是一道经典的约瑟夫环问题。可以使用循环链表来模拟这个过程,具体实现方式如下:
首先,定义一个节点类,表示每个人:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
```
然后,根据输入的人数 M,创建一个循环链表:
```python
# 构建循环链表
head = Node(1)
p = head
for i in range(2, M + 1):
node = Node(i)
p.next = node
p = node
p.next = head
```
接下来,模拟报数过程。定义一个计数器 count,每次循环计数器加 1,当计数器等于 N 或 K 时,删除当前节点,继续循环。直到链表中只剩一个节点时,退出循环:
```python
# 模拟报数过程,删除节点
count = 1
while head.next != head:
if count == N:
print("{:4d}".format(head.value), end="")
head.value = head.next.value
head.next = head.next.next
count = 1
elif count == K:
p = head
while p.next != head:
p = p.next
print("{:4d}".format(head.value), end="")
p.next = head.next
head = head.next
count = 1
else:
head = head.next
count += 1
print("{:4d}".format(head.value))
```
最后,输出剩余节点的编号即为最后出列的次序。完整代码如下:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
M, N, K = map(int, input().split())
# 构建循环链表
head = Node(1)
p = head
for i in range(2, M + 1):
node = Node(i)
p.next = node
p = node
p.next = head
# 模拟报数过程,删除节点
count = 1
while head.next != head:
if count == N:
print("{:4d}".format(head.value), end="")
head.value = head.next.value
head.next = head.next.next
count = 1
elif count == K:
p = head
while p.next != head:
p = p.next
print("{:4d}".format(head.value), end="")
p.next = head.next
head = head.next
count = 1
else:
head = head.next
count += 1
print("{:4d}".format(head.value))
```
阅读全文