约瑟夫问题:

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

1. 方法一

Code:

list1 = [i for i in range (1 , 42)]
# print(list1)
ls = []
while True:ls.append (list1[2])list1 = list1[3::] + list1[0:2:]# print(list1)if len (list1) == 2:break
print (ls)   # 输出 [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 1, 5, 10, 14, 19, 23, 28, 32, 37, 41, 7, 13, 20, 26, 34, 40, 8, 17, 29, 38, 11, 25, 2, 22, 4, 35]
print(list1)  # 输出 [16, 31]

解决约瑟夫问题的方法有许多种,在数据结构中,大部分都是用循环链表来解决约瑟夫问题的,太复杂不会,这里刚开始思考是分片操作拿出满足的数,然后删除这个数,将列表后再加一个列表,可是这会改变列表的索引,随着循环的次数增加,根本无法写出满足要求的算式,后来搜索找到另一个思路,只需要取出第n个需要的数,然后以这个数将列表拆开,将n之后的列表和n之前的列表组装成一个新的列表,如此只需循环下去便可得到需要的数,当列表的长度不满足再进行重组列表操作时,但是当剩下的数小于n的时候,系统就会执行不了,因为数不到n,所以说这种方法还不是很好的,如果不是数3,而是数9 ,10 比较大的,就会留下很多数.

2.方法二

Code:

list1 = [i for i in range (1,42)]
n = 1
a = 0
while len (list1) > 0:if n == 3:n = 1print (list1[a],end=',')list1.pop (a)else:n += 1a += 1if a == len (list1):a = 0

这一种方法使用两个变量进行控制,一个变量控制计数,每数到3的时候变成1重新数,同时输出并删除掉这个数,另一个变量控制着列表的索引,当循环走到列表结束时,赋值为0 ,意味着从列表头部重新开始循环,两个变量互不干扰,这样就可以一直循环下去,列出所有人的死亡顺序,一步到位.当然这个思路也可以用于字典,将列表换成字典,key为每个人的数字,从1开始,value都设为一,思路同上,只不过并不是删除元素,而是更改value为0,然后加个判断,如果循环到value为0的键,将控制键的变量加1 后继续下次循环判断,因为这里没有删除,所以判断value为0后仍要加1.代码参考如下:

Code:

people = {}
for x in range (1,42):people[x] = 1i = 1
j = 0
while i <= 42:if i == 42:i = 1else:if people[i] == 0:i += 1else:j += 1if j >= 3:people[i] = 0j = 0print (i,end=' ')else:i += 1

python解决约瑟夫问题相关推荐

  1. python解决约瑟夫问题_Python实现约瑟夫环问题的方法

    本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...

  2. python解决约瑟夫环(杀人游戏)

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

  3. python中约瑟夫环程序_Python实现约瑟夫环问题的方法

    本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...

  4. 高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...

  5. Python版本的数据结构书_《用Python解决数据结构与算法问题》

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  6. Python解决The truth value of a Series is ambiguous.md

    Python解决The truth value of a Series is ambiguous.md import pandas as pd data = pd.read_csv('x.csv') ...

  7. python计算学生平均年龄_CodeSalt | Python解决按学生年龄排序的实际问题

    Python解决按学生年龄排序的实际问题 问题:定义一个Class:包含姓名name.性别gender.年龄age,需要按年龄给学生排序. 输入:包含学生对象的List. 输出:按照年龄age进行排序 ...

  8. php约瑟夫问题,php 解决约瑟夫问题实现方法

    这篇文章主要为大家详细介绍了php 解决约瑟夫问题实现方法,具有一定的参考价值,可以用来参考一下. 对php解决约瑟夫问题的两段代码感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 一群猴 ...

  9. 用 python 解决汉诺塔问题并附带演示过程

    用 python 解决汉诺塔问题并附带演示过程 参考文章: (1)用 python 解决汉诺塔问题并附带演示过程 (2)https://www.cnblogs.com/shinawear/p/1061 ...

  10. python解决组合问题

    python解决组合问题 参考文章: (1)python解决组合问题 (2)https://www.cnblogs.com/vipchenwei/p/7147488.html (3)https://w ...

最新文章

  1. vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
  2. c语言交通违章编程代码,C语言程序设计之交通处罚单管理系统 报告(内含代码).doc...
  3. Linux环境下Python的安装过程
  4. cms文章 mysql存储_MySQL存储引擎笔记
  5. IP address 和子网划分
  6. [运维笔记] PowerShell (模块).模块的查找、安装、卸载、更新、保存、发布
  7. 从 1 加到 55 的值
  8. parasolid 原因 效率_SolidWorks、creo、UG哪个更适合机械设计?听听行业大咖怎么说...
  9. 牛顿迭代法求解根号a的Matlab代码
  10. python详细教程#2下载python
  11. 我的CV实习工作总结
  12. 修改oracle用户资源限制,oracle用户登陆失败次数限制修改
  13. 愿世间所有美好都恰逢其时
  14. AndroidSwipeLayout:最强大的 Swipe Layout
  15. 自己整理的资料 视频格式以及参数含义
  16. 基于PHP的餐饮行业管理系统
  17. [转载] Rooting with a Locked Boot Loader
  18. 浩辰3D软件新手入门攻略:草图绘制功能全解析!
  19. Excel无法另存为的解决办法
  20. 软件测试之测试主流技能

热门文章

  1. 自我觉察日志——9.17 (为什么老想买东西?)
  2. Linux向github上传代码以及遇到的坑们
  3. cpi计算机性能指标,将CPU时间=(CPI指令总数).ppt
  4. 后PC时代中国半导体厂商的机会
  5. Unity笔记之切换鼠标图标样式、PSD格式文件导入Unity
  6. 达尔优108机械合金版键盘驱动 正式版
  7. Common IO 使用小结
  8. 磁盘分区,格式化,挂载
  9. Excel竟然能够按照单元格的指定颜色顺序排序
  10. 嵌入式系统多媒体框架分析