Python解“约瑟夫生者死者小游戏”
2020-11-06
为了让大家提高对循环以及判断语句的掌握,今天分享一道经典题目《约瑟夫生者死者小游戏》。有三十个人在一条船上,但是超载了,需要十五个人下船,于是人们排成一队,排队的位置即是他们的编号(1-30),排好队后,从排头往排尾按照顺序从1到9循环报数,报数到9的人就下船,如此循环,直到船上仅剩下15人。请问,有哪些人下了船?
通过解答这道题能够提高大家绘制流程图、理解循环体以及判断结构的掌握程度(图1)。
从流程图中我们可以发现使用了一层循环、三层判断。首先是循环报数(遍历到最后一个再重新回到初始位置开始下一次遍历)直到下船人数达到十五人。其次判断遍历的人是否还在船上,如果在,则报数;否则的话跳过本次循环,遍历下一个人。最后是报数的内容,如果报数到9,那个人就要下船,计数器要返回1,并且下一次遍历时就不考虑他,按照次序依次遍历。相信大家如果能够看懂流程图,那么问题就可以迎刃而解了。
通过流程图把程序的流程搞清楚之后,我们可以用任何编程语言把代码写出来,我这里选择使用Python软件来编写,代码如图2。
首先外層people我选择用字典来统计。按照循环的指示,初始情况给30个人都赋予了初始值为1。接下来新建三个变量check作为计数(0-9);i作为人们的编号(1-30);j为下船的人数,一旦下船的人数等于15,退出循环。接下来我们使用一个while循环控制,因为只有30个人所以当i循环到超过30时,手动将i设置为1,进行重复的循环遍历,当j等于15时,代表下船的人数达到约定人数,跳出循环。
接下来就是本题最关键的环节——统计计数了。当people[i]为0时,表示此人已下船,i加1,继续循环,当people[i]为1时进行check统计,每次加1,当check等于9时,代表报数到9,对应人需要下船,将此人的people[i]值设置为0,显示j为下船的人数,下一个人j加1,运行效果如图3。
本次实例主要考查对循环和判断结构的理解能力,绘制流程图是一项非常重要的技能,很多复杂的程序不可能上来就写代码,流程图能够帮助我们很好地捋顺思路。