题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
解法:
利用二进制串表示七段码所有开关状态,0~6位分别表示a~g管,并且按照题意写出邻接表.
采用广度优先搜索的思想判断 七段码是否连通.
import queue
Map = {'0': ['1', '5'],
'1': ['0', '2', '6'],
'2': ['1', '3', '6'],
'3': ['2', '4'],
'4': ['3', '5', '6'],
'5': ['0', '4', '6'],
'6': ['1', '2', '4', '5']
}
def check(s):
vis = set()
q = queue.Queue()
for w in range(len(s)):
if s[w] == '1':
vis.add(str(w))
q.put(vis.pop())
while not q.empty():
node = q.get()
for next_node in Map[node]:
if next_node in vis:
q.put(next_node)
vis.remove(next_node)
else:
continue
if vis:
return False
else:
return True
ans = 0
for i in range(1, 128):
if check(f'{i:07b}'):
ans += 1
print(ans)