当前位置:   article > 正文

Python经典实例:约瑟夫生者死者小游戏_30个人在一条船上需要15人下去数到9的下船

30个人在一条船上需要15人下去数到9的下船

目录

游戏规则

算法思考

代码实现


游戏规则:

30 个人在一条船上,超载,需要 15 人下船。

于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。

如此循环,直到船上仅剩 15 人为止

算法思考:

毫无疑问,每数到第九个人就下船,并且重新开始计数,我们可以简单的想到以下代码:

  1. while i:
  2. check += 1
  3. if check == 9:
  4. people[i] = 0
  5. check = 0
  6. print("{}号下船了".format(i))
  7. else:
  8. i+=1
  9. continue

但是在我们的代码中,并不能体现当第一轮每九个人(也就是3个人)下船后,再一次计数,此时people[ ]中之前下船的人仍然占据着位置,并没有真正的清除。则需要continue跳过:

  1. if people[i] == 0:
  2. i+=1
  3. continue
  4. else:
  5. check+=1
  6. if check == 9:
  7. people[i]=0
  8. check = 0
  9. print("{}号下船了".format(i))

如此一来会跳过之前已经下船的人编号,聪明的读者也发现了people[i]==0是用的字典方法,也就是说,想要判断该编号的人有没有下船,则需要字典的方法,编号即键对应的值是否为1来判断:

  1. people={}
  2. for x in range(1,31):
  3. people[x]=1 #创建关于people的字典,每个键的值均为1

代码实现:

  1. people={}
  2. for x in range(1,31):
  3. people[x]=1 #创建people字典,每个编号的值都为1
  4. # print(people)
  5. check=0 #循环9,记数
  6. i=1 #people的编号
  7. j=0 #下船人数或者船余下人数
  8. while i<=31:
  9. if i == 31:
  10. i=1 #每当循环到最后一个人时,重新循环
  11. elif j == 15:
  12. break #如果场上剩余15人,终止循环
  13. else:
  14. if people[i] == 0: #读取到如果该编号的值等于0即已经下船 则跳转下一位
  15. i+=1
  16. continue
  17. else:
  18. check+=1 #循环9记数加一
  19. if check == 9:
  20. people[i]=0
  21. check = 0
  22. print("{}号下船了".format(i)) #如果记数满了 则输出,并且多一位下船人
  23. j+=1
  24. else:
  25. i+=1
  26. continue #循环未满,下一位

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/434908
推荐阅读
相关标签
  

闽ICP备14008679号