【Python训练营】Python每日一练----第9天:七段码
📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜
🏅🏅🏅Python领域优质创作者,大二在读,欢迎大家找我合作学习(文末有VX 想进学习交流群or学习资料 欢迎+++)
💕入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟✨✨✨
前言:
【Python训练营】是针对Python语言学习所打造的一场刷题狂欢party! 对基础知识把握不牢固的话,欢迎参考此套课程:Python公开课 搭配使用最佳嗷~喜欢的话就抓紧订阅起来吧!🍋🍋🍋如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者在文末添加我的VX,我会拉你进学习交流群,我们一起交流学习,报团打卡
@TOC
题目描述
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要用七段码数码管来表示一种特殊的文字。
图片描述
上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, ga,b,c,d,e,f,g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。
例如:bb 发光,其他二极管不发光可以用来表达一种字符。
例如 cc 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, ea,b,c,d,e 发光,f, gf,g 不发光可以用来表达一种字符。
例如:b, fb,f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
运行限制
最大运行时间:1s
最大运行内存: 128M
高手做法:画图
其实看到这个题目时,我第一感觉就是高中的排列组合问题,那我就直接画图数就可以啦,反正种类也应该不多:
# 第一种类型,只有一段数码管发光
l1 = 7
# 两段数码管发光(ab,af,bc,bg,cg,cd,de,eg,ef,fg)
l2 = 10
# 三段数码管发光(abf,abc,abg,afg,afe,bcd,bcg,bgf,bge,cgd,cgf,cge,cde,cdg,deg,def,efg)
l3 = 16
# 四段数码管发光(abcd,abcg,abcf,abge,abgf,abfe,afeg,bcde,bcdg,bcgf,bcge,bged,bgef,cdef,cdeg,cdgf,cgfa,cgfe,defg,defa)
l4 = 20
# 五段数码管发光(查两段不发光ab,ac,ad,ae,af,ag,bc,bd,be,bg,cd,cf,cg,de,df,dg,ef,eg,fg)
l5 = 19
# 六段数码管发光(查一段不发光)
l6 = 7
# 七段数码管发光
l7 = 1
sum = l1 + l2 + l3 + l4 + l5 + l6 + l7
print(sum)
解题思路
- 采用字典将该标号相接的所有标号列举出来
dict = {'a': ['f', 'b'], 'b': ['a', 'c', 'g'], 'c': ['b', 'd', 'g'], 'd': ['e', 'c'], 'e': ['d', 'f', 'g'], 'f': ['a', 'e', 'g'], 'g': ['b', 'c', 'e', 'f']}
- 然后将所有的键进行组合,组成分别含有1、2、3、4、5、6、7个元素的所有组合,将其存储在列表中,方便以后使用;
- 进而进行遍历列表,如果便利出来的元素长度为1,肯定符合要求;
- 如果大于1,则要将此元素重新进行排列,因为比如说在new_list列表中出现的 “cfg” 这种情况("cfg"也是代表不同字符的一种情况),如果不对字符串 “cfg” 进行有序排列,直接采用:
for c in range(1, len(str1)):
if str1[c - 1] not in dict[str1[c]]:
break
else:
num += 1
break
语句进行判断,由于 “c” 没有在 dic[“f”]中,所以就会遗落 “cfg” 这种情况。
如果采用有序排列的方式,就不会遗落类似于 “cfg” 的情况:
for situation in itertools.permutations(str1):
for c in range(1, len(situation)):
if situation[c - 1] not in dict[situation[c]]:
break
else:
num += 1
break
对str1字符串有序排列后,当situation = “cgf” 时,会执行else语句,使得num加一,并且退出外层的for循环。而不会出现遗落的情况
源码分享
import itertools
new_list = []
# 计数
num = 0
# 采用字典将该标号相接的所有标号列举出来
dict = {'a': ['f', 'b'], 'b': ['a', 'c', 'g'], 'c': ['b', 'd', 'g'],
'd': ['e', 'c'], 'e': ['d', 'f', 'g'], 'f': ['a', 'e', 'g'],
'g': ['b', 'c', 'e', 'f']}
string = list(dict.keys())
# print(string)
for i in range(1, 8):
# 对string字符串中的前i个字符进行无序组合,i表示几个数为一个组合。
for j in (itertools.combinations(string, i)):
new_list.append(''.join(j))
# print(new_list)
for str1 in new_list:
# 如果字符串的长度为1, ('a', 'b', 'c', 'd', 'e', 'f', 'g')均可代表一个不同字符,故直接加一
if len(str1) == 1:
num += 1
continue
# print(str1)
for situation in itertools.permutations(str1):
# print(situation)
for c in range(1, len(situation)):
# print(situation[c-1])
# print(dict[situation[c]])
if situation[c] not in dict[situation[c-1]]:
break
else:
num += 1
break
print(num)
学习总结
今天总结一下我们数学中常说的排列组合问题:
1.itertools.combinations()用法:
for j in (itertools.combinations('abcd', 3)):
print(j)
print(''.join(j))
# ('a', 'b', 'c')
# ('a', 'b', 'd')
# ('a', 'c', 'd')
# ('b', 'c', 'd')
# abc
# abd
# acd
# bcd
2.itertools.permutations()用法:
import itertools
for i in itertools.permutations('abc'):
print(i)
# ('a', 'b', 'c')
# ('a', 'c', 'b')
# ('b', 'a', 'c')
# ('b', 'c', 'a')
# ('c', 'a', 'b')
# ('c', 'b', 'a')
🏅今天是我在Python训练营的第 9 天,希望每天都能见到最棒的你🏅
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
- 点赞
- 收藏
- 关注作者
评论(0)