约瑟夫环游戏:单链表实现及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()

代码说明

  1. Node: 定义单链表节点结构体,包含节点编号 num 和指向下一个节点的指针 next
  2. create_circle_linked_list(M) 函数: 创建包含 M 个节点的循环链表,并返回链表头节点。
  3. remove_node(head, pos) 函数: 删除循环链表中指定位置 pos 的节点,并返回被删除节点的编号和新的链表头节点。
  4. josephus_game(M, passwords) 函数: 模拟约瑟夫环游戏,传入初始人数 M 和报数密码列表 passwords,返回每一遍游戏结束后出列的队列次序。
  5. main() 函数: 读取输入数据,调用 josephus_game() 函数进行游戏模拟,并输出游戏结果。

总结

本文通过单链表数据结构实现约瑟夫环游戏,并提供了 Python 代码示例。代码结构清晰,易于理解,并包含详细注解。希望本篇文章能够帮助你更好地理解约瑟夫环游戏及其算法实现。

注意事项

请注意,这只是一个示例代码,可能还需要根据具体要求进行调整和完善。如果你有任何问题,请随时提问。

约瑟夫环游戏:单链表实现及Python代码示例

原文地址: https://www.cveoy.top/t/topic/ycf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录