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***[email protected]
参考方法:
奇卡
ycz***[email protected]
看看python有多优雅
189***[email protected]
参考方法:
看看python有多优雅
189***[email protected]
fanzhao
732***[email protected]
参考方法:
fanzhao
732***[email protected]
百川
pos***163.com
约瑟夫环是很经典的题目。以下代码充分利用 Python 数据结构的特性,以求尽可能简洁。
百川
pos***163.com
shohan
532***[email protected]
上面写的有点复杂了,其实可以很简单的几行代码,如下直接定义成函数调用吧:
shohan
532***[email protected]
逆光追梦
303***[email protected]
运行的结果:
逆光追梦
303***[email protected]
随遇而安
109***[email protected]
这个问题的关键在于每次循环只选出一个人。因为当留在船上的人数大于报数最大值的2倍时,若每次循环选出所有的可能数,则会造成结果中留在船上人少于目标值。将问题定义成函数如下:
随遇而安
109***[email protected]
Python小白
141***[email protected]
把前面两位大神的代码简单综合了一下,更加简单且适用各种情况的是。
Python小白
141***[email protected]
realmesir
rea***[email protected]
realmesir
rea***[email protected]
季修梵
tim***[email protected]
GitHub上看到的解决方法,代码简单易懂,参考下。
季修梵
tim***[email protected]
Deng
chh***[email protected]
用从字典里移除键值的方法来解决这个问题:
Deng
chh***[email protected]
waipcat
wai***[email protected]
跟上边有几位同学的思路差不多,不过应该是最短的了,5 行:
waipcat
wai***[email protected]
Deng
chh***[email protected]
紧跟上一位同学的思路:
Deng
chh***[email protected]
Deng
chh***[email protected]
将上一个稍作调整:
Deng
chh***[email protected]
Eric
nus***[email protected]
利用切片,每次生成一个新的序列:
Eric
nus***[email protected]
camsun
ken***[email protected]
参考:
camsun
ken***[email protected]
学海无牙
yua***[email protected]
参考方法:
学海无牙
yua***[email protected]
Rounie
rou***[email protected]
方法一:
思想就是:队列从头开始按顺序报 1-9 之间的数,报完数的人站到队列末尾,报数是 9 的成员下船,如果有人下船,则下一个人从 1 开始报数,循环继续,直至下船人数达到 15 人停止。
所以该方法特点:第一、报数的人一定站在队列首位,当然下船的人也是在首位。第二、每下船一人,队列长度减一。第三、下船人号码正好是初始序列号码,在编程中表现即是下船号码是列表索引加 1。
方法二:
借鉴前几楼思路,使用列表切片来生成新的队列,并且改进之前的初始生成序列 0-29 为 1-30。
Rounie
rou***[email protected]
Alyna
aly***[email protected]
使用队列(先进先出原理),代码如下:
Alyna
aly***[email protected]