蓝桥杯真题——“七段码”
对于这道题目而言,理解起来不算难事,可以采用穷举的形式画出所有符合要求的结果,贴个链接:蓝桥杯 七段码 枚举所有情况 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)