Pythonはヨセフスの問題を解決する(簡単バージョンを理解します)

Pythonはヨセフスの問題を解決する(簡単バージョンを理解します)

ヨセフスの問題:与えられたn個の個人(数字1,2,3と... nが、それぞれ表す)ラウンドテーブルの周りに座っていました。彼は、人へと1 Countin番号からkに隣の人が殺されたです;人の数から、kは殺される者の数であり、kをオフにカウントし始めたので、法律がするまで繰り返されますラウンドテーブルの周りだけ、最後の方。

最初のブログは、展覧会をしてください。

超簡単バージョンを理解する:
アイデアを:ちょうど内側に行くために、すべての人のリストを置くために始めた、数3は、リストから削除されていることを置かれた場合の数字は、行くためにリストの上の位置に人を入れて3最終ではありません報告。以下のように、リストまで2人まで残り:

def josephus(n,k):
    #n代表总人数,k代表报数的数字
    List = list(range(1,n+1))
    index = 0
    while List:
        temp = List.pop(0)
        index += 1
        if index == k:
            index = 0
            continue
        List.append(temp)
        if len(List)==2:
            print(List)
            break

if __name__ == '__main__':
    josephus(41,3)

-------------------------------------------------- - 私は、行を分割しています--------------------------------------------- ---------------------

片道循環リスト方式(の使用を停止するには、リストの知識を統合するためのメソッド)
の考え方を:一方向の循環リストの使用は、上記と同様の方法で、次のコードで、実際には、次のとおりです。

class Node(object):
    """结点"""
    def __init__(self,item):
        self.elem = item
        self.next = None

class SingleCycleLinkList(object):
    """单向循环链表"""
    def __init__(self):
        self.head = None

    def append(self,item):
        node = Node(item)
        if self.head is None:
            self.head = node
            node.next = node
        else:
            cur = self.head
            while cur.next != self.head:
                cur = cur.next
            cur.next = node
            node.next = self.head

    def travel(self):
        cur = self.head
        while cur.next != self.head:
            print(cur.elem, end=" ")
            cur = cur.next
        print(cur.elem)

    def remove(self,item):
        '''删除节点'''
        cur = self.head
        pre = None
        while cur.next != self.head:
            if cur.elem == item:
                #头节点的情况
                if cur == self.head:
                    rear = self.head
                    while rear.next != self.head:
                        rear = rear.next
                    rear.next = cur.next
                    self.head = cur.next
                else:
                    #中间结点的情况
                    pre.next = cur.next
                return
            else:
                pre = cur
                cur = cur.next
    #尾节点的情况和一个元素的情况
        if cur.elem == item:
                # 一个元素的情况
            if cur == self.head:
                self.head = None
                # 尾节点元素的情况
            else:
                pre.next = self.head
                # pre.next = cur.next

    def judgement(self):
        cur = self.head
        count = 1
        while cur != cur.next :
            cur = cur.next
            count += 1
            if count == 3:
                self.remove(cur.elem)
                print("%d-->"%cur.elem,end="")
                count = 0
        print(cur.elem)

if __name__ == '__main__':
    sll = SingleCycleLinkList()
    for i in range(1,42):
        sll.append(i)
    sll.judgement()

公開された31元の記事 ウォン称賛13 ビュー9910

おすすめ

転載: blog.csdn.net/qq_43497702/article/details/88047489
おすすめ