"""
约瑟夫环问题:
设有编号为1,2,3,......,n的n个人围成的圈,从第1个人开始从1报数,报到m时停止,报m的人退出圈,再从下1个人开始重新从1开始报数,
报m的退出圈......直到退出x个人为止
编码思路:
1.将所有人的编号放入所有人集合
2.确定第1个退出的人,将其放到退出者集合
3.从所有人集合中删掉退出的人,并找到下一个退出的人在所有人集合中的下标(第1个人的下标 + 指定退出的数 - 前一个退出的人)
超出剩余总人数后取余,重新开始报数
"""
def joseph(n,m,x):
"""
:param n: 总人数
:param m: 指定退出的报数
:param x: 总共退出人数
:return: 退出者的顺序集合
"""
outer = [None] * x #依次退出者的集合
resource = [i+1 for i in range(n)] #所有人的集合
index = m-1 #指定报数退出者的下标
for j in range(x): #循环x次
outer[j] = resource[index] #将退出者先存进退出者集合
del resource[index] #从所有人集合中删除退出者
if len(resource) > 0: #判断是否全部退出
index = (index + m-1) % len(resource) #计算下一个退出者的下标:第1个人的下标 + 指定退出的数 - 前一个退出的人
return outer
print(joseph(10,3,10))
#[3, 6, 9, 2, 7, 1, 8, 5, 10, 4]
Python-约瑟夫环
最新推荐文章于 2024-08-05 08:54:31 发布