原题链接:蓝桥杯算法提高VIP-开灯游戏
解题思路:
①可以看到题中只需要九位二进制数,全部情况列举只有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分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复