约瑟夫环问题-python代码

问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。

分析:假设有10人,报数为3的出列。这里我启用一个环链表来实现,从第一个结点开始,让每一个结点报数,这个结点报数为3,则从链表中移出,最后剩下的就是我们的答案。

代码如下:

class node():
    def __init__(self, value, next=None):
        self.value = value
        self.next = next


def creat1(n):
    if n < 0:
        return 0
    if n == 1:
        return node(1)
    else:
        root = node(1)
        tem = root
        for i in range(2, n + 1):
            tem.next = node(i)
            tem = tem.next
        tem.next = root
        return root


def main(n, k):
    if k == 1:
        return n
    root = creat1(n)
    tem = root
    while True:
        for i in range(k - 2):
            tem = tem.next
        tem.next = tem.next.next
        tem = tem.next
        if tem.next == tem:
            break
    print(tem.value)


if __name__ == '__main__':
    main(10, 3)

如果代码有错,欢迎留言指正。

你可能感兴趣的:(算法)