问题描述

30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

算法思路

  1. 用环形链表去构造数据结构
  2. 每逢9的倍数,将该链表删除,指针指向下一个数字

核心代码

# 首先构造环形链表,这个很基本不多说
# 删除链表操作
while remain_people != 15:for ii in range(1,8):        # 前7次运动是没有任何问题的ptr = ptr.nextelse:                     # 第8次运动,需要跳过第9个数,并将其删除# 打印9号链表print(ptr,'{}号下船了'.format(ptr.next.name))# 删除9号链表(同时跳过这个数)ptr.next = ptr.next.nextremain_people -= 1# 指针向前运动一次ptr = ptr.next

完整代码实现

'''
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?思路:用环形链表去做
'''
# 1 定义一个类
class people:def __init__(self):self.name = ' 'self.next = None# 初始化第一个链表
head = people()
head.name = '1'
ptr = head# 2, 对30个人进行初始化,用字符串进行初始化
for ii in range(2,31):new_people = people()new_people.name = str(ii)ptr.next = new_peopleptr = ptr.next# 形成环形链表
ptr.next = head# 测试环形链表,测试通过
debug = 0
if debug:ptr = headwhile True:print(ptr,ptr.name)ptr = ptr.nextif ptr == head:breakelse:pass
else:pass# 3, 开始遍历,用while remain_people !=15 来判断
#     嵌套1个循环,用for循环,每逢9,删除一个链表,并打印出来
remain_people = 30
ptr = head
while remain_people != 15:for ii in range(1,8):ptr = ptr.nextelse:# 打印9号链表print(ptr,'{}号下船了'.format(ptr.next.name))# 删除9号链表ptr.next = ptr.next.nextremain_people -= 1# 指针向前运动一次ptr = ptr.next

运行效果

<__main__.people object at 0x01A00AB0> 9号下船了
<__main__.people object at 0x01A00CF0> 18号下船了
<__main__.people object at 0x01A00F30> 27号下船了
<__main__.people object at 0x01A009F0> 6号下船了
<__main__.people object at 0x01A00C70> 16号下船了
<__main__.people object at 0x01A00EF0> 26号下船了
<__main__.people object at 0x01A009F0> 7号下船了
<__main__.people object at 0x01A00CF0> 19号下船了
<__main__.people object at 0x01A00FF0> 30号下船了
<__main__.people object at 0x01A00B70> 12号下船了
<__main__.people object at 0x01A00E70> 24号下船了
<__main__.people object at 0x01A009F0> 8号下船了
<__main__.people object at 0x01A00DF0> 22号下船了
<__main__.people object at 0x01A009B0> 5号下船了
<__main__.people object at 0x01A00DF0> 23号下船了Process finished with exit code 0

小结

这个代码是一次性写成功的,没有出任何bug,说明非常高效,思考了一下原因如下:

  1. 在写代码之前,一定要在草稿纸上画一遍,观察数据特点,以及数据变化过程,然后再设计数据结构和算法。
  2. 进入编译器,把题目抄上去注释用三引号注释,接着开始写代码思路123,具体功能,怎么循环,怎么判断等等,然后用#注释掉
  3. 接着在注释掉的地方开始写代码框架,如循环,判断框架。写好之后再去完善变量,定义。
  4. 写到一半的时候,就要写一个测试代码,用if debug来控制是否启用,便于提前找出问题,并加深理解程序。

python约瑟夫生死小游戏的实现相关推荐

  1. python手机版做小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏...

    1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...

  2. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  3. python编程小游戏-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  4. python小游戏代码大全-python简单小游戏代码 怎么用Python制作简单小游戏

    1.Python猜拳小游戏代码: 2.import random #导入随机模块 3. 4.num = 1 5.yin_num = 0 6.shu_num = 0 7.while num <= ...

  5. python设计拼图小游戏_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  6. 教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  7. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

  8. python拼图游戏编码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  9. Python学习—2048小游戏等4个小练习

    Python学习-2048小游戏等4个小练习 转载于:https://www.cnblogs.com/ChangAn223/p/10627777.html

最新文章

  1. Java项目:网上图书商城系统(java+SSM+Jsp+MySQL+Redis+JWT+Shiro+RabbitMQ+EasyUI)
  2. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )
  3. C++ STL究竟有多慢?
  4. 数据集成之主数据管理(转载整理)
  5. left join on and 与 left join on where的区别
  6. WPF(Windows Presentation Foundation)Overview
  7. webpack 保存文件后自动打包_继webpack后又一打包神器Parcel
  8. curd日志记录php,ThinkPHP学习之CURD操作(一)
  9. 怎么提高wifi速度?
  10. [c++]常对象的特点
  11. [UWP]创建一个ProgressControl
  12. 《Redis开发与运维》----- 客户端
  13. 014-JVM-查看class文件的工具Binary viewer、ue、classlib Bytecode viewer
  14. 【傻瓜教程】手把手教你安装pip
  15. HS6 USB数据采集卡、USB高速数据采集卡,高级触发功能图解
  16. 华为公司是如何做绩效考核的
  17. GOF23设计模式之建造者模式
  18. 组装台式机后进入PE,检测不到硬盘的解决方法
  19. 根据视频URL解析视频信息(本地|网络)
  20. 基于jsp+java+ssm妇女联合会管理系统-计算机毕业设计

热门文章

  1. STM32工作笔记0013---认识UCOS系统
  2. java面试准备之---Struts2体系知识点,系统复习,struts2原理,ognl,el支持.---随时更新
  3. python编程(再述rpc)
  4. win32开发(按键消息)
  5. 搜索引擎的那些事(开篇)
  6. catia文本时怎么换行_【二次开发】CATIA二维图 环形文字工具
  7. 基于51单片机的密码锁
  8. java jolt tuxedo_Java通过Jolt调用Tuxedo服务
  9. python绘制turtle心电图代码_python的生态系统是由标准库和第三方库组成的,turtle库是其标准库,所以不需要安装。_学小易找答案...
  10. 安装两个mysql3308_在同一台机器上安装两个版本的MySQL