python 约瑟夫生者小游戏 用list实现

问题描述:

30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

  查看网上的资料都是把人员实例为字典,1代表在船上,0代表下船。网上的实现代码如下:

python 约瑟夫生者小游戏 用list实现

 1 people={}
 2 for x in range(1,31):
 3   people[x]=1
 4 # print(people)
 5 check=0
 6 i=1
 7 j=0
 8 while i<=31:
 9   if i == 31:
10     i=1
11   elif j == 15:
12     break
13   else:
14     if people[i] == 0:
15       i+=1
16       continue
17     else:
18       check+=1
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

View Code

  重新写了一种以list来实现该功能。代码如下:

 1 people = [x for x in range(1, 31)]  # 生成人员
 2 
 3 xia = []  # 存放下船人的list
 4 j = 0  # 上次顺序下船的余量
 5 while True:
 6     for i in range(1, len(people)+1):
 7 
 8         if (i+j) % 9 == 0:
 9             xia.append(people[i-1])
10     j = (len(people) + j) % 9
11     print("下船者:", xia)
12     for x in xia:
13         people.remove(x)
14     xia = []
15     if len(people) <= 15:
16         break

----------------------------------------------------------6.29 更新--------------------------------------------------------------------

发现上面的代码有漏洞,

1、第11行打印下船人数,但是这一步人还没有remove出list,所以这行代码要后置

2、上面的代码考虑不全,容易下船的人多于15个。原因就是第13行在remove的时候没有增加人数的判断(第15~16行的代码)

  比如修改为50人,数到的3下船,留20人在船上。用上面的代码跑就会导致船上留的人少于20人

故,修改代码如下: 

people = [x for x in range(1, 51)]  # 生成人员
xia = []  # 存放下船人的list
j = 0  # 上次顺序下船的余量
while True:
    for i in range(1, len(people)+1):
        if (i+j) % 3 == 0:
            xia.append(people[i-1])
    j = (len(people) + j) % 3  # 余数需要计入下一次循环
    for x in xia:
        people.remove(x)
        print("下船者:", x)
        if len(people) == 20:  # 判断到20人的时候终止循环
            raise "完成"  # 用异常退出2次循环
        else:
            continue
    xia = []

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 约瑟夫生者小游戏 用list实现 - Python技术站

(0)
上一篇 2023年4月2日 下午5:26
下一篇 2023年4月2日 下午5:26
合作推广
合作推广
分享本页
返回顶部