约瑟夫环游戏:单链表实现及Python代码示例
约瑟夫环游戏:单链表实现及Python代码示例
问题描述
有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。
算法实现
本题要求使用单链表实现,程序要求采用模块化设计,格式规范,有合适注解。
代码示例
# 定义单链表节点结构体
class Node:
def __init__(self, num):
self.num = num
self.next = None
# 创建循环链表
def create_circle_linked_list(M):
head = Node(1)
curr = head
for i in range(2, M+1):
newNode = Node(i)
curr.next = newNode
curr = newNode
curr.next = head
return head
# 删除指定位置节点,并返回其编号
def remove_node(head, pos):
if pos == 1:
prev = head
while prev.next != head:
prev = prev.next
removedNode = head
if head == head.next:
head = None
else:
head = head.next
prev.next = head
else:
prev = head
for _ in range(pos-2):
prev = prev.next
removedNode = prev.next
prev.next = removedNode.next
return removedNode.num, head
# 游戏完成后队列次序
def josephus_game(M, passwords):
result = []
head = create_circle_linked_list(M)
for password in passwords:
sequence = []
while head:
pos = password % M
if pos == 0:
pos = M
removedNum, head = remove_node(head, pos)
M -= 1
sequence.append(removedNum)
result.append(sequence)
return result
# 主函数
def main():
# 读取输入
inputs = input().split()
M = int(inputs[0])
passwords = list(map(int, inputs[1:]))
# 游戏完成后队列次序
result = josephus_game(M, passwords)
# 输出结果
for sequence in result:
for num in sequence:
print(f'{num:4}', end='')
print()
if __name__ == "__main__":
main()
代码说明
Node类: 定义单链表节点结构体,包含节点编号num和指向下一个节点的指针next。create_circle_linked_list(M)函数: 创建包含 M 个节点的循环链表,并返回链表头节点。remove_node(head, pos)函数: 删除循环链表中指定位置pos的节点,并返回被删除节点的编号和新的链表头节点。josephus_game(M, passwords)函数: 模拟约瑟夫环游戏,传入初始人数M和报数密码列表passwords,返回每一遍游戏结束后出列的队列次序。main()函数: 读取输入数据,调用josephus_game()函数进行游戏模拟,并输出游戏结果。
总结
本文通过单链表数据结构实现约瑟夫环游戏,并提供了 Python 代码示例。代码结构清晰,易于理解,并包含详细注解。希望本篇文章能够帮助你更好地理解约瑟夫环游戏及其算法实现。
注意事项
请注意,这只是一个示例代码,可能还需要根据具体要求进行调整和完善。如果你有任何问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/ycf 著作权归作者所有。请勿转载和采集!