解题思路:

①可以看到题中只需要九位二进制数,全部情况列举只有512种,可以直接挨个进行模拟,对于每一种情况,记录这种情况的操作完成后九盏灯的状态,如果最终开着的灯有四个,则这种情况是成立的,输出。

②定义b(x)函数将十进制x变为题中所需的九位二进制,为了方便下标,此处为十位,下标为0的第一位无意义,仅用来占位

③定义change(n)函数改变第n个灯的状态,此处可以用+1对2求余数的方法达到0和1之间的转换,0代表关灯,1代表开灯注意事项:

④字典d记录开第几个开关后,第几个灯的状态发生改变

参考代码:

#定义b(x)函数将十进制x变为题中所需的九位二进制,为了方便下标,此处为十位,下标为0的第一位无意义,仅用来占位
def b(x):
    s=bin(x)[2:]
    return '0'*(10-len(s))+s#十位,第零位恒为零

#定义change(n)函数改变第n个灯的状态,此处可以用+1后对2求余数的方法达到0和1之间的转换,0代表关灯,1代表开灯注意事项:
def change(n):
    l[n]=(l[n]+1)%2

#记录开第几个开关后,第几个灯的状态发生改变
d={1:[2,4],2:[1,3,5],3:[2,6],4:[1,5,7],5:[2,4,6,8],6:[3,5,9],7:[4,8],8:[5,7,9],9:[6,8]}
    
for i in range(513):#对512种情况进行模拟
    l=[0]*10#记录九盏灯的状态,第零位空着,0代表关、1代表开
    s=b(i) #得到十进制数的十位二进制表达
    for k in range(1,10):#这十位0和1中
        if(s[k]=='1'):#若有某位为1,表示第几个开关开了
            for j in d[k]:#遍历这个开关控制的灯
                change(j)#改变一次这些灯的状态
    if(l.count(1)==4):#如果最终开着的灯有四个
        print(s[1:])#输出这种情况


点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论