小白的python学习日记----用简单粗暴的条件语句解决灯泡环问题

昨天在APP上看到有人发的100个灯泡圆环的问题,心血来潮,用Python试了一下。小白在这方面没什么经验,谈不上什么算法,就是简单粗暴的条件循环,所幸最终得以实现。
抛砖引玉,请各位看官大佬指教!

算法题:
一个圆环上100个灯泡,灯泡有两种状态(亮,灭),灯泡状态随机;
按一个灯泡,相邻的两个灯泡状态也发生变化;
设计一道算法,使所有灯泡最后都亮;

思路:
步骤1:编号为0-99 号灯泡 ;
步骤2:依次检查0-97号,如 n 号灯泡熄灭,则按一下n+1 号的开关,这样可以保证0-97 号灯泡是亮的。
步骤3:执行完步骤2后,只剩下9899两颗灯泡状态不确定。
    一共四种可能:
    A. 98-99-亮:
    B. 98-99-灭:
    C. 98-99-亮:
    D. 98-99-灭:
    逐一分析:
    A.全部灯泡亮起,任务完成;
    B/C.这时候有99个亮和1个灭。很明显,可以很轻松的让已经亮起的99个全灭,实现100个全灭。既然可以100个全灭,同样可以100个全亮。
    于是当达到99+1灭后,可以进入步骤4.
    D.两个灭的是连在一起的,这时候只要按一下9899上的开关,就会变成991灭的状态,同样进入步骤4.
步骤4:有99个亮和1个灭,假设灭的那个编号0,按下开关10-1-2就从灭--亮变成亮--灭,剩下97个全亮。
    然后三个一组,熄灭3-98号共96个,就变成-99-0-两个亮的,其余全灭,再按一下开关0,就变成1号亮,其余99个全灭;
    再三个一组,依次亮起2-990号,即可大功告成。

"""
#用+/- 示意灯泡的状态,函数随机生成长度100的列表,表示灯泡环的状态。
def dengpao():
    import random
    zhuangtai = ["+","-"]
    list = ''
    for y in range(1,101):
        x = random.randint(0,1)
        i = zhuangtai[x]
        #print("第%d个灯泡,状态是"%y+i)
        list =  list + i
        #print(str(list))
        y = y + 1
    return list
dengpao()

list0 = list(dengpao())
print ("初始状态:\n",list0)

#### 函数表示改变单个灯泡状态
def kaiguan(y):
    yy = int(y)
    a = list0[yy]
    if a == '+':
        a = '-'
    elif a =='-':
        a = '+'
    list0[yy] = a
    return list0[yy]

###按下第n个灯泡开关,第n个灯泡及其相邻灯泡状态改变;
def touch(x):
    n=x+1
    if x>0 and x<99:
        print("按下第%d个灯泡开关"%n)
        kaiguan(x)
        kaiguan(x-1)
        kaiguan(x+1)
    elif x==-1:
        print("按下第100个灯泡开关" )
        kaiguan(x)
        kaiguan(x - 1)
        kaiguan(x + 1)
    elif x==0:
        print("按下第%d个灯泡开关" %n)
        kaiguan(0)
        kaiguan(99)
        kaiguan(1)
    elif x==99:
        print("按下第%d个灯泡开关" %n)
        kaiguan(98)
        kaiguan(99)
        kaiguan(0)
    else:
        print("ERROR info!!!数值超出。")

###第一步:循环开关法:
def 循环开关法():
###检查0-97号,只要是关,就按下一个灯泡的开关,这样保证0-97都是开着的。
    for l in range (0,98):
        while (list0[l] == '-'):
            m = l + 1
            cishu = 0
            if m<100:
                touch(m)
            else:
                touch(0)


循环开关法()
print("第一轮结束,灯泡状态:\n",list0)

count = list0.count('-')        #统计未亮的灯泡数;
print("当前未亮灯泡数:",count)
if  count == 0:
    print("已成功让所有灯泡亮起!")
elif count == 1: #不亮的灯泡序号是98或99。
    不发光的家伙 = list0.index('-')
    print("第%d个灯泡没有亮!"%(不发光的家伙+1))
    if 不发光的家伙 ==98:  #按下99号,然后从1-4-7-...-97;这时候0号是亮的,其余都是灭的;
        touch(99)
        print(list0)
        xx = 1
        while xx<=97:
            touch(xx)
            xx = xx +3
            continue
        print("第2.1轮结束,灯泡状态:\n", list0)
        yy = 2      #接下来从2号开始,隔3按一下,直到 98
        while yy<=98:
            touch(yy)
            yy = yy + 3

    elif 不发光的家伙 == 99: #依葫芦画瓢
        touch(0)
        xx = 2
        while xx <= 98:
            touch(xx)
            xx = xx + 3
            continue
        print("第2.1轮结束,灯泡状态:\n", list0)
        yy = 3
        while yy <= 99:
            touch(yy)
            yy = yy + 3
    print("已成功让所有灯泡都亮起!")
    print(list0)
elif count == 2: #如果剩两个不亮,一定是第98和99号。先
    print("还有俩灯泡没有亮!")
    zz = 1
    while zz <=97:
        touch(zz)
        zz = zz +3
    zzz = 0
    while zzz <= 96:
        touch(zzz)
        zzz = zzz +3
    print("已成功让所有灯泡都亮起!")
    print(list0)

执行结果:
初始状态:
[’-’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘-’, ‘-’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’, ‘-’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’, ‘+’, ‘+’, ‘-’, ‘-’, ‘-’, ‘-’, ‘+’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘-’, ‘-’, ‘-’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘+’, ‘+’, ‘-’, ‘+’, ‘-’, ‘+’, ‘-’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘-’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘+’, ‘-’, ‘-’, ‘+’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘+’, ‘-’, ‘-’, ‘-’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’, ‘-’, ‘-’, ‘+’, ‘+’, ‘-’, ‘-’, ‘+’, ‘-’, ‘-’]
按下第2个灯泡开关
按下第3个灯泡开关
按下第4个灯泡开关
按下第5个灯泡开关
按下第8个灯泡开关
按下第10个灯泡开关
按下第11个灯泡开关
按下第15个灯泡开关
按下第16个灯泡开关
按下第18个灯泡开关
按下第20个灯泡开关
按下第21个灯泡开关
按下第24个灯泡开关
按下第29个灯泡开关
按下第31个灯泡开关
按下第34个灯泡开关
按下第36个灯泡开关
按下第40个灯泡开关
按下第41个灯泡开关
按下第45个灯泡开关
按下第46个灯泡开关
按下第47个灯泡开关
按下第49个灯泡开关
按下第50个灯泡开关
按下第55个灯泡开关
按下第57个灯泡开关
按下第64个灯泡开关
按下第65个灯泡开关
按下第67个灯泡开关
按下第68个灯泡开关
按下第69个灯泡开关
按下第72个灯泡开关
按下第73个灯泡开关
按下第74个灯泡开关
按下第77个灯泡开关
按下第78个灯泡开关
按下第81个灯泡开关
按下第82个灯泡开关
按下第83个灯泡开关
按下第86个灯泡开关
按下第88个灯泡开关
按下第89个灯泡开关
按下第91个灯泡开关
按下第94个灯泡开关
按下第95个灯泡开关
按下第98个灯泡开关
按下第99个灯泡开关
第一轮结束,灯泡状态:
[’+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’, ‘+’]
当前未亮灯泡数: 1
第99个灯泡没有亮!
按下第100个灯泡开关
[’-’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘-’]
按下第2个灯泡开关
按下第5个灯泡开关
按下第8个灯泡开关
按下第11个灯泡开关
按下第14个灯泡开关
按下第17个灯泡开关
按下第20个灯泡开关
按下第23个灯泡开关
按下第26个灯泡开关
按下第29个灯泡开关
按下第32个灯泡开关
按下第35个灯泡开关
按下第38个灯泡开关
按下第41个灯泡开关
按下第44个灯泡开关
按下第47个灯泡开关
按下第50个灯泡开关
按下第53个灯泡开关
按下第56个灯泡开关
按下第59个灯泡开关
按下第62个灯泡开关
按下第65个灯泡开关
按下第68个灯泡开关
按下第71个灯泡开关
按下第74个灯泡开关
按下第77个灯泡开关
按下第80个灯泡开关
按下第83个灯泡开关
按下第86个灯泡开关
按下第89个灯泡开关
按下第92个灯泡开关
按下第95个灯泡开关
按下第98个灯泡开关
第2.1轮结束,灯泡状态:
[’+’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’, ‘-’]
按下第3个灯泡开关
按下第6个灯泡开关
按下第9个灯泡开关
按下第12个灯泡开关
按下第15个灯泡开关
按下第18个灯泡开关
按下第21个灯泡开关
按下第24个灯泡开关
按下第27个灯泡开关
按下第30个灯泡开关
按下第33个灯泡开关
按下第36个灯泡开关
按下第39个灯泡开关
按下第42个灯泡开关
按下第45个灯泡开关
按下第48个灯泡开关
按下第51个灯泡开关
按下第54个灯泡开关
按下第57个灯泡开关
按下第60个灯泡开关
按下第63个灯泡开关
按下第66个灯泡开关
按下第69个灯泡开关
按下第72个灯泡开关
按下第75个灯泡开关
按下第78个灯泡开关
按下第81个灯泡开关
按下第84个灯泡开关
按下第87个灯泡开关
按下第90个灯泡开关
按下第93个灯泡开关
按下第96个灯泡开关
按下第99个灯泡开关
已成功让所有灯泡都亮起!
[’+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’, ‘+’]

Process finished with exit code 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值