數據結構與算法(Python版):用隊列(Queue)處理約瑟夫問題

在古羅馬時期,猶太人背叛了羅馬人,落到困境,約瑟夫和同行的一共39個猶太人只可以自殺殉國,可是猶太教義規定不能自殺,所以只可以讓別人將本身殺害。他們全部39我的坐成一圈,報數1—7,報到7則由身旁的人將本身殺死。結果約瑟夫靈機一動,給本身安排了一個位置,最後活了下來,那麼約瑟夫給本身安排的是哪個位置呢?app

在這個題目當中,咱們若是使用隊列,不只能夠處理任意人數坐成一圈,還能夠將報數的值任意修改,最後均可以找到那一個不被殺死的人的位置。咱們能夠將全部人都放進一個大的隊列裏,每報一次數字,那麼就把隊列頭部的人放到隊列的尾部,直到報數報到一組數字的最後一個,好比1——7當中的7。這個時候就將隊列頭的這我的刪除(也就是殺死),不斷執行這個過程,直到整個隊列當中的人數只有一個,則跳出循環返回最後活着的那我的的名字。spa

首先定義隊列(Queue)類的結構:code

class Queue():

    def __init__(self):
        # 初始化一個空的列表
        self.__list=[]

        # 往隊列裏插入元素
    def enqueue(self,item):
        self.__list.append(item)

    # 彈出隊列裏的元素
    def dequeue(self):
        return self.__list.pop(0)# 彈出隊列裏最早進入的元素

    # 判斷隊列是否爲空
    def is_empty(self):
        return self.__list == []

    # 計算隊列的大小
    def size(self):
        return len(self.__list)

使用隊列類來初始化一個對象,sim_queue,而後編寫剛纔咱們分析以後的程序:對象

def hot_potato(namelist,num):

    sim_queue = Queue()

    for name in namelist:
        sim_queue.enqueue(name) # 把拿到的名字所有都放到隊列裏

    while sim_queue.size() > 1:
        for i in range(num):
            sim_queue.enqueue(sim_queue.dequeue())
        # 每執行完一次,就將隊列的頭拿出來彈出,至關於土豆傳遞給這我的,而後這我的就死了

        last_person=sim_queue.dequeue()

    return last_person

print("開始執行約瑟夫問題")
print(hot_potato(["bob","NAni","Ao li Gei!","HeHe","Mike","Suvennia"],4))

輸出:blog

開始執行約瑟夫問題
Ao li Gei!

得解,所以Ao li Gei!這我的不會被殺死。隊列

相關文章
相關標籤/搜索