【Python训练营】Python每日一练----第9天:七段码

举报
是Dream呀 发表于 2022/01/27 14:42:16 2022/01/27
【摘要】 【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 天,希望每天都能见到最棒的你🏅

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。