刷微博期间,看到这样的题目,一下子勾起了当年搞ACM的劲头,在脉脉职言中,有这样一个题目。
算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机。设计算法,使灯泡都亮。看到微博中还是有很多大神级别的分析的,你怎么看呢?
解答:
第一阶段:
如果给100个灯泡编号0~99 ,顺序往下走,如果灯是亮的就不管,灭的就按下后面灯泡使这个灯亮(在第一循环内,也就是还没有从99走到0)。如果都是亮的那正好万事大吉完事!如果不是的话,期间肯定有是灭的,不管它在哪个位置,重复【亮的就不管,灯是灭的把下一个灯泡按一下开关】规则(都在第一轮循环里面)。98号灯肯定是灭的,看99号灯是灭还是亮,如果99号灯是灭的,那就再按一下99号灯的开关,这样全环只有一个灭的灯(0号灯)。如果99号灯是亮的,这样只有98号灯是灭的。总之,全环只有一个灯是灭的。
第二阶段:
将那个灭的灯标记为0号灯,后面的灯依次按顺序排序,每3个一组,中间的那个灯按开关,举例,将2号灯开关打开,1,2,3号灯就都灭了,整个循环跑完,所有的灯都灭了。
第三阶段:
每个灯泡的开关都按一遍。以上步骤就可以使最后的灯泡全亮。
代码如下:
import random
i =0
j = [] #100个灯泡
while True:
'''创建100个灯泡'''
if i == 100:
break
k = ['亮','暗']
k = random.sample(k, 1)
j.append(k)
i += 1
print(j)
j[0] = ['亮']#选择一个亮灯泡,标记为0号
m,n = 0,0
while True:
m,s,n = m+1,m+2,m+3
if n==100:
if j[m] == ['暗']:
j[m] = ['亮']
break
if j[m]==['暗']:
j[m] = ['亮']
if j[s] == ['暗'] and j[n] == ['暗']:
j[s] = ['亮']
j[n] = ['亮']
elif j[s] == ['亮'] and j[n] == ['暗']:
j[s] = ['暗']
j[n] = ['亮']
elif j[s] == ['暗'] and j[n] == ['亮']:
j[s] = ['亮']
j[n] = ['暗']
else:
j[s] = ['暗']
j[n] = ['暗']
print(j)
不知道大家有什么解法,欢迎解答,指点迷津。
推荐阅读
(点击标题可跳转阅读)