灯泡状态随机,设计算法,使100个灯泡都亮改进算法

算法题:一个圆环上有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值