算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机。设计算法,使灯泡都亮。看到微博中还是有很多大神级别的分析的,你怎么看呢?
经过特例分析,会有一盏灯永远无法点亮的情况,具体未作分析。
采用贪心算法思想,具体思路是保证当前灯泡m是点亮的,具体操作是当m灯泡是灭的时候在顺时针链上开闭一次m灯泡的儿子灯泡m+1,使得m灯泡变亮。
具体代码如下:
import random def check(j: []): index = 0 for i in j: if i == '暗': index = index + 1 if index > 1: return False if index > 1: return False else: return True def light_on(j: []): index = 0 for i in j: if i == '亮': index = index + 1 print("亮的数量是:" + str(index)) if __name__ == '__main__': i = 0 j = [] # 100个灯泡 while True: '''创建100个灯泡''' if i == 100: break k = ['亮', '暗'] k = random.sample(k, 1) j.append(k[0]) i += 1 print(j) light_on(j) # j[0] = '亮' # 选择一个亮灯泡,标记为0号 m, n = 0, 0 while True: m, s, n = m + 1, m + 2, m + 3 if(j[m%100] == '亮' and j[s%100] == '亮'): if(check(j)): break elif(j[m%100] == '暗' and j[s%100] == '亮'): j[m%100] = '亮' j[s%100] = '暗' if(j[n%100] == '亮'): j[n%100] = '暗' else: j[n%100] = '亮' if(check(j)): break elif (j[m%100] == '亮' and j[s%100] == '暗'): if(check(j)): break elif (j[m%100] == '暗' and j[s%100] == '暗'): j[m%100] = '亮' j[s%100] = '亮' if (j[n%100] == '亮'): j[n%100] = '暗' else: j[n%100] = '亮' if(check(j)): break print(j) light_on(j)
部分代码参考:https://blog.csdn.net/u012846795/article/details/106615650