问题描述

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. PHP开发中session无法获取和保存问题解决方法

    今天在程序设计中无法在session中获得内容,使用编辑器打开php.ini配置文件,在其中搜索"session.save_path", 把行中前面注释用的";" ...

  2. flex布局实现瀑布流排版

    网上有很多有关js(jq)实现瀑布流和有关瀑布流的插件很多,例如:插件(Masonry,Wookmark等等).按照正常的逻辑思维,瀑布流的排版(item列表)一般都是 由左到右,上而下排序的结果,单 ...

  3. mysql查询出所有重复的记录

    假如我们有如下一张数据表(很简单,只是举例而已),表名为student.现在我们要取出其中重复记录.重复是以name相同为判定标准. ID name phone age 1 张三 10086 15 2 ...

  4. 2019-2020-1 20199304《Linux内核原理与分析》第七周作业

    进程的描述和进程的创建 1.进程描述 1.1操作系统的三大管理功能以及对应的抽象概念: 进程管理 内存管理 文件系统 1.2Linux进程的状态: (1)Linux中进程的状态细分可以分为七种: R运 ...

  5. Java学习笔记1(基础)

    计算机语言和Java 计算机语言主要由一些指令(包括数字.符号和语法等)组成,可以分为机器语言.汇编语言.高级语言三大类.Java是一种高级计算机语言,是一种可以编写跨平台应用软件.完全面向对象的程序 ...

  6. 【直播分享】实现LOL小地图英雄头像分析案例【华为云分享】

    直播介绍: 当今时代是人工智能高速发展的时代,深度学习已经渗透入经济.工业.军事.娱乐等各各领域的角落.近年来AlphaGo击败李世石更是使得人工智能技术家喻户晓.人工智能在游戏领域的开发依然不断进步 ...

  7. Python中的Tcp协议应用之TCP服务端-协程版(推荐)

    利用gevent第三方库,实现协程. 通过协程实现一个服务端服务多个客户端需求. 使用协程的好处是协程比线程更加节省内存资源. gevent安装命令: pip3 install gevent 注意:在 ...

  8. 实例详解——编译器命令#pragma section作用于函数时作用域是否覆盖到其子函数

    在之前的博客[链接脚本(Linker Script)应用实例(一)使用copy table将函数载入到RAM中运行]中,我们第一步使用#pragma section命令将PFlashProgram函数 ...

  9. 让微信推送Jenkins构建消息

    Jenkins作为开发必备之神器,各家大小公司都在使用.Jenkins自身内置了基于邮件推送构建结果的功能.但是随着移动互联网的发展,邮件这玩意已经越来越少使用了,是否有一种办法能把jenkins构建 ...

  10. SI522和RC522/ZS3801/FM17520的区别

    小编最近在测试一颗新的芯片,是国内知名厂家中科微研发的,主打超低功耗的厂家. 经过测试和比较小编发现 相对于MFRC522,SI522可以完全替换,不需要做任何更改,同时接受模式下功耗低10mA左右, ...