【实验课】一群人围一圈,隔一个杀一个,剩一个,最后活谁?

实验三大步骤:一立Flag,二百度,三动手,四发朋友圈。

问题

东罗马帝国,里奥二世曾今让64名死刑犯站成一个圈,隔一个杀一个,杀到剩下一个为止。并让所有死刑犯自己争抢位置,如果你是死刑犯的一员,你要挑什么位置呢?

对N问题


问题一般化:包含N个节点(节点编号1-N)的圆,隔一个节点从中摘除一个节点,直到只剩下一个节点为止。求剩下节点的编号。

问题特殊化:应当从N=1,...,10开始逐步研究起,以求得规律,此处改为一律用程序实现

代码如下:

#0=live 1=death
def f(n):
    li=[0]*n
    i=0
    death=0
    while True:
        #如果活的杀死他,并隔一个指向下一个位置
        if li[i]==0:
            li[i]=1
            death=death+1
            if death==n-1:
                break
            i=(i+2 if i+2<n else i+2-n) 
        #如果死的,不进行操作
        elif li[i]==1:
            i=(i+1 if i+1<n else i+1-n)
    for i in range(n):
        if li[i]==0:
            print(i+1)#0对应1
            return


for i in range(2,101):
    f(i)

结果如图:

猜测规律:N人参加的排队杀人游戏,如果N为偶数,存活者为N,如果为奇数,存活者为N-1。进一步升华总结到,队伍中最大的偶数角色会存活。

归纳法证明规律:

1.k=2,3时,存活者编号分别为2,2,符合规律

2.假设k=N时成立,首轮收割后,奇数者死去,偶数者的队尾仍旧在队尾。N->N-1**有问题还,等待有志者协同证明

猜你喜欢

转载自blog.csdn.net/qq_40938169/article/details/87190630