【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。
在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。
这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
解题:并查集+深搜
(答案不对但看不出哪错了)
from string import ascii_letters
from itertools import combinations
from collections import deque
class UF:
def __init__(self, count, ori: tuple):
self.res = 0
self.count = count
self.lst = []
self.deque = deque(ori)
self.parent = {
'a': ['b', 'f'],
'b': ['a', 'g', 'c'],
'c': ['b', 'd', 'g'],
'd': ['c', 'd'],
'e': ['d', 'f', 'g'],
'f': ['a', 'e', 'g'],
'g': ['b', 'c', 'e', 'f']
}
def union(self, x):
if self.lst:
for node in self.lst:
if x in self.parent[node]:
self.lst.append(x)
return True
else:
return False
else:
self.lst.append(x)
return True
def func(self):
length = self.count
while True:
count = 0
while count < length:
x = self.deque.popleft()
if self.union(x):
pass
else:
self.deque.append(x)
count += 1
if length == len(self.deque):
break
else:
length = len(self.deque)
if not self.deque:
break
if len(self.deque) == 0:
return True
if __name__ == '__main__':
str_lst = list(ascii_letters[:7])
count = 0
for i in range(1, 8):
for choice in combinations(str_lst, i):
uf = UF(i, choice)
if uf.func():
count += 1
print(i, count)
print(count)