数据结构与算法(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!这我的不会被杀死。队列

相关文章
相关标签/搜索