Python 约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
实例
people={}
for x in range(1,31):
people[x]=1
# print(people)
check=0
i=1
j=0
while i<=31:
if i == 31:
i=1
elif j == 15:
break
else:
if people[i] == 0:
i+=1
continue
else:
check+=1
if check == 9:
people[i]=0
check = 0
print("{}号下船了".format(i))
j+=1
else:
i+=1
continue
执行以上实例,输出结果为:
9号下船了 18号下船了 27号下船了 6号下船了 16号下船了 26号下船了 7号下船了 19号下船了 30号下船了 12号下船了 24号下船了 8号下船了 22号下船了 5号下船了 23号下船了
奇卡
ycz***18qijian@qq.com
参考方法:
奇卡
ycz***18qijian@qq.com
看看python有多优雅
189***03000@189.cn
参考方法:
看看python有多优雅
189***03000@189.cn
fanzhao
732***338@qq.com
参考方法:
fanzhao
732***338@qq.com
百川
pos***163.com
约瑟夫环是很经典的题目。以下代码充分利用 Python 数据结构的特性,以求尽可能简洁。
百川
pos***163.com
shohan
532***493@qq.com
上面写的有点复杂了,其实可以很简单的几行代码,如下直接定义成函数调用吧:
shohan
532***493@qq.com
逆光追梦
303***66@qq.com
运行的结果:
逆光追梦
303***66@qq.com
随遇而安
109***9506@qq.com
这个问题的关键在于每次循环只选出一个人。因为当留在船上的人数大于报数最大值的2倍时,若每次循环选出所有的可能数,则会造成结果中留在船上人少于目标值。将问题定义成函数如下:
随遇而安
109***9506@qq.com
Python小白
141***7026@qq.com
把前面两位大神的代码简单综合了一下,更加简单且适用各种情况的是。
Python小白
141***7026@qq.com
realmesir
rea***sir@126.com
realmesir
rea***sir@126.com
季修梵
tim***o@outlook.com
GitHub上看到的解决方法,代码简单易懂,参考下。
季修梵
tim***o@outlook.com
Deng
chh***g@hotmail.com
用从字典里移除键值的方法来解决这个问题:
Deng
chh***g@hotmail.com
waipcat
wai***t@126.com
跟上边有几位同学的思路差不多,不过应该是最短的了,5 行:
waipcat
wai***t@126.com
Deng
chh***g@yahoo.com
紧跟上一位同学的思路:
Deng
chh***g@yahoo.com
Deng
chh***g@hotmail.com
将上一个稍作调整:
Deng
chh***g@hotmail.com
Eric
nus***h@sina.com
利用切片,每次生成一个新的序列:
Eric
nus***h@sina.com
camsun
ken***enjian@outlook.com
参考:
camsun
ken***enjian@outlook.com
学海无牙
yua***iu@gmail.com
参考方法:
学海无牙
yua***iu@gmail.com
Rounie
rou***jane@163.com
方法一:
思想就是:队列从头开始按顺序报 1-9 之间的数,报完数的人站到队列末尾,报数是 9 的成员下船,如果有人下船,则下一个人从 1 开始报数,循环继续,直至下船人数达到 15 人停止。
所以该方法特点:第一、报数的人一定站在队列首位,当然下船的人也是在首位。第二、每下船一人,队列长度减一。第三、下船人号码正好是初始序列号码,在编程中表现即是下船号码是列表索引加 1。
方法二:
借鉴前几楼思路,使用列表切片来生成新的队列,并且改进之前的初始生成序列 0-29 为 1-30。
Rounie
rou***jane@163.com