约瑟夫环

来源:互联网 发布:玩转财务大数据 编辑:程序博客网 时间:2024/06/05 21:57

约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环

{\displaystyle n}n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过(m-1)个人,并杀掉第m个人。接着,再越过m-1个人,并杀掉第m个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。

问题是,给定了{\displaystyle n}n和m,一开始要站在什么地方才能避免被处决?

问题扩展之后就是:约瑟夫环的起始位置是C,并不是第一个。

分析:首先要建立一个循环链表示人站的圆圈。然后找到起始位置(C),最后按照M规则删除链表中的元素

假设一共7个人(N = 7),相隔的位置为2(M = 2),起始位置为3(C = 3)。


所以最后得到的序列是:[5, 7, 2, 4, 1, 6, 3]


python 代码实现:

# -*- coding: utf-8 -*-class Node(object):def __init__(self, value):self.value = valueself.next = Nonedef create_linkList(n):head = Node(1)pre = headfor i in range(2, n+1):newNode = Node(i)pre.next= newNodepre = newNodepre.next = headreturn headdef josephus(N,M,C):    head = create_linkList(N)    pre = None    cur = head    JoseList = []    if M == 1:        for i in range(N):            JoseList.append((C+i+1)%N)    else:        for i in range(C):            cur = cur.next        while cur.next != cur:  # 终止条件是节点的下一个节点指向本身            for i in range(M - 1):                pre = cur                cur = cur.next            JoseList.append(cur.value)            pre.next = cur.next            cur.next = None            cur = pre.next        JoseList.append(cur.value)    return JoseListn = 7 #总的个数m = 2 #间隔的数目c = 3 #当前位置newlist = josephus(n,m,c)print(newlist)

结果显示: