题解 | 约瑟夫环
约瑟夫环
https://www.nowcoder.com/practice/e417cfe32c74416ca38247f619ddb322
n,k,m=map(int,input().split()) my_dict={x:True for x in range(n)} start=k for i in range(1,n): # 外层循环的次数为n-1次,通过n-1轮游戏,淘汰掉n-1个数字,剩下的那个数字即代表获胜者 loop=0 # 内层循环的条件变量 pointer=start while loop < m-1: # 内层循环,当 pointer经过m-1次有效移动(加一)后,内层循环结束(每一次内层循环表示一轮游戏结束,可以淘汰掉一个人) flag=True while flag: # 这个while循环用于进行pointer指针的有效加1,因为pointer移动过程中,如果my_dict[pointer]为False,则表示无效移动 pointer=pointer+1 if pointer == n: # 如果pointer等于n,表示来到了环的末尾,此时需要将pointer执行环首 pointer=0 if my_dict[pointer]==True: # 若 my_dict[pointer]==True 表示有效移动,意味着本次有效移动结束,将flag置为False,退出循环 flag=False loop+=1 # 每次有效移动(while flag:循环结束)后,将loop加1 my_dict[pointer]=False # 每层循环结束(一轮游戏结束后),标记哪个数字被淘汰掉 flag=True # 然后寻找下一轮游戏的起始位置 while flag: pointer=pointer+1 if pointer == n: pointer=0 if my_dict[pointer]==True: flag=False start=pointer #以上整个循环结束后,pointer所指向的数字 即为最后的获胜者 print(pointer) # if my_dict[pointer]==False: # if pointer+1 == n: # pointer=0 # else: # pointer+=1 # else: # loop+=1 # loop + 1 表示为有效的+1 # if pointer+1 == n: # pointer=0 # else: # pointer+=1 # if loop == m-1: # my_dict[pointer]=False # if pointer+1 == n: # pointer=0 # else: # pointer+=1 # # print(f"loop={loop},pointer={pointer}") # print(my_dict) # start=pointer # print(start)