蓝桥杯真题——“七段码”(python实现)

蓝桥杯真题——“七段码”


2020  蓝桥杯省赛   填空题

​ 对于这道题目而言,理解起来不算难事,可以采用穷举的形式画出所有符合要求的结果,贴个链接:蓝桥杯 七段码 枚举所有情况 80种,感兴趣的话可以看一下这个博主的文章。

但是,最关键的还是在于如何采用代码实现解题方法,我的解题思路是这样的:

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 = "".join(list(dict.keys()))
for i in range(1, 8):
    # 对string字符串中的前i个字符进行无序组合
    for j in (itertools.combinations(list(string), i)):
        new_list.append("".join(j))
"""
new_list列表存储的字符串如下:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'bc', 'bd', 'be', 'bf', 'bg', 'cd', 'ce', 'cf', 'cg', 'de', 'df', 'dg', 'ef', 'eg', 'fg', 'abc', 'abd', 'abe', 'abf', 'abg', 'acd', 'ace', 'acf', 'acg', 'ade', 'adf', 'adg', 'aef', 'aeg', 'afg', 'bcd', 'bce', 'bcf', 'bcg', 'bde', 'bdf', 'bdg', 'bef', 'beg', 'bfg', 'cde', 'cdf', 'cdg', 'cef', 'ceg', 'cfg', 'def', 'deg', 'dfg', 'efg', 'abcd', 'abce', 'abcf', 'abcg', 'abde', 'abdf', 'abdg', 'abef', 'abeg', 'abfg', 'acde', 'acdf', 'acdg', 'acef', 'aceg', 'acfg', 'adef', 'adeg', 'adfg', 'aefg', 'bcde', 'bcdf', 'bcdg', 'bcef', 'bceg', 'bcfg', 'bdef', 'bdeg', 'bdfg', 'befg', 'cdef', 'cdeg', 'cdfg', 'cefg', 'defg', 'abcde', 'abcdf', 'abcdg', 'abcef', 'abceg', 'abcfg', 'abdef', 'abdeg', 'abdfg', 'abefg', 'acdef', 'acdeg', 'acdfg', 'acefg', 'adefg', 'bcdef', 'bcdeg', 'bcdfg', 'bcefg', 'bdefg', 'cdefg', 'abcdef', 'abcdeg', 'abcdfg', 'abcefg', 'abdefg', 'acdefg', 'bcdefg', 'abcdefg']
"""
for str1 in new_list:
    # 如果字符串的长度为1, ('a', 'b', 'c', 'd', 'e', 'f', 'g')均可代表一个不同字符,故直接加一
    if len(str1) == 1:
        num += 1
        continue
    """
    当字符串的长度大于1时,需要将字符串str1进行有序组合,有序排列的目的主要是:在运行if条件语句的时候,避免遗漏代表不同字符出现的情况
    
    比如说在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循环。而不会出现遗落的情况
    """
    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
print(num)
# num = 80

虽然这个结果是得出来了,但是这个算法它所需要的时间开销也是比较大的,我测试的运行时间在997ms左右(万幸的是没有超过1s)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值