此题与第34届IMO第六题较为相似,都涉及组合操作中的状态空间问题,操作从第n步判断第n-1盏灯的状态改变下一盏灯的状态改成:每一步根据当前亮灯的数量改变编号为该序数的灯的状态(可以用硬币正反面代替),这个达到指定状态(全灭)的平均步数是1/4*n*(n+1),比第34届第六题问题步数要少很多,31盏灯,需要2097151步,34盏灯的话,它需要255652815步,这个只需要大约300多步。
# IMO 60.5模拟
import random
num = int(input("请输入硬币的数量:"))
arr = [0] * num
for i in range(0, num):
arr[i] = random.randint(0, 1)
print("初始状态:", arr)
step = 0
while True:
arr_sum = 0
step += 1
for i in range(0, num):
if arr[i] == 1:
arr_sum += 1
if arr_sum == 0:
print("成功终止!")
break
else:
arr[arr_sum-1] = (arr[arr_sum-1]+1) % 2
print(f"第{step}步:", arr)