问题描述

N个人围成一个圈, 从第一个人开始报数, 报到M的人出圈, 剩下的人继续从1开始报数, 报到M的人出圈;如此往复, 直到所有人出圈.

列表解决

def solution_list(n, m):
"""
初始化一个长度为n的列表, 默认值为True. 当某个元素出圈时, 将其置为False.
循环迭代这个列表, 遇到值为False的元素则跳过, 当列表中全为False时表示所有人
都已出圈.
"""
# 初始化列表
people = []
for _ in range(n):
people.append(True) result = []
num = 1
while any(people):
for index, p in enumerate(people):
if p:
if num == m: # 出圈操作
people[index] = False
result.append(index + 1)
num = 1
else:
num += 1
print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)
def solution_list2(n, m):
"""
这是上面这种思路的另一种解法, 将圈内和圈外表示成0和1.
这里实现循环迭代的方式我第一次遇到, 记录一下
"""
people = [0 for _ in range(n)] alive = n # 剩余人数
index = 0
num = 0 # 计数器, 当index == m时出圈
result = [] while alive > 0:
num += 1 - people[index] # 每轮到一个人报数, 不论0或1都进行计数
if num == m:
result.append(index + 1) # 出圈
people[index] = 1 # 将出圈人置为 1
alive -= 1 # 剩余人数 - 1
num = 0 # 重置计数器 # 与总人数 n 取余, 可以实现index在 0 ~ count -1之间一直循环, 达到循环迭代的目的
index = (index + 1) % n print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)

循环链表解决

class Node:
"""节点"""
def __init__(self, value):
self.data = value
self.next = None def __repr__(self):
return f'Node: {self.data}' class CircularLinkedList:
"""循环链表"""
def __init__(self):
self.rear = None # 尾节点 def is_empty(self):
return self.rear is None def append(self, elem):
"""尾插法"""
temp = Node(elem)
if self.rear is None:
temp.next = temp
self.rear = temp
else:
temp.next = self.rear.next
self.rear.next = temp
self.rear = temp def solution_circular_linked_list(n, m):
"""
通过循环链表解决, 每次出圈弹出该节点
"""
clist = CircularLinkedList()
for i in range(n):
clist.append(i + 1) result = []
pre = clist.rear # 当前节点的上一个节点
cur = clist.rear.next # 当前节点
num = 0 # 计数器 while cur.next is not cur:
num += 1
if num == m: # 出圈
result.append(cur.data)
pre.next = cur.next # 弹出当前节点
num = 0 # 重置计数器
else:
pre = pre.next
cur = cur.next
result.append(cur.data) print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)

参考:

经典算法--约瑟夫环问题的三种解法

百度百科

约瑟夫问题 -- python实现的更多相关文章

  1. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  2. 约瑟夫环问题及python与c++实现效率对比

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...

  3. python中使用queue实现约瑟夫环(约瑟夫问题)求解

    约瑟夫问题:是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列: 依 ...

  4. 10行Python代码解决约瑟夫环(模拟)

    http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 #!/usr/bin/env python # coding: utf ...

  5. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  6. python - 约瑟夫问题

    在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中.39个犹太人决定宁愿死也不要被敌人俘虏,商定一种特殊的方式自杀,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自 ...

  7. Python练习——约瑟夫环问题、用类方法描述一个数字时钟

    一.约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他 ...

  8. python算法:约瑟夫问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特後,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41 ...

  9. 浅谈如何使用python抓取网页中的动态数据

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...

随机推荐

  1. 复制节点(cloneNode)

    DOM提供用来复制节点方法. cloneNode():将为给定节点创建一个副本,这个方法的返回值是一个指向新建克隆节点的引用指针, reference = node.cloneNode(deep) 这 ...

  2. 12-kubernetes Dashboard 认证及分级授权

    目录 部署 dashboard 查看 开放访问 配置dashboard用户 1. token 令牌认证 创建一个 serviceAccount dashboard-admin 绑定 clusterbi ...

  3. 【SSL题解报告】没有上司的舞会

    题目: 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指 ...

  4. 重写TabBar遇到的按钮不显示的问题

    这里的控件frame没有进行设置,无法显示 这里初始化的按钮 frame也为0, 因此 在 重写某个控件的时候 一定要调用layoutSubviews这个方法来对这个控件内部的子控件进行赋值

  5. RestSharp Simple REST and HTTP API Client for .NET

    var client = new RestClient("http://example.com"); // client.Authenticator = new HttpBasic ...

  6. iOS App Extension入门

    转自简书:http://www.jianshu.com/p/8cf08db29356   iOS 10推出了很多新功能,其中有几个高调的变化:通知栏更加实用,电话可以防骚扰,iMessage变得更加有 ...

  7. HDU1847 Good Luck In CET4 Everybody

    大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...

  8. BZOJ 1051: [HAOI2006]受欢迎的牛(SCC)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8172  Solved: 4470[Submit][Sta ...

  9. 2018HDU多校训练一 K - Time Zone

    Chiaki often participates in international competitive programming contests. The time zone becomes a ...

  10. mui 顶部选项卡的两种切换方式

    mui 顶部选项卡的两种切换方式 第一种main页面 <!DOCTYPE html> <html> <head> <meta charset="ut ...