【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。
在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。
这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
结果:80
import itertools
class UnionFindSet():
def __init__(self,n):
self.setSize = n #不连通区域
self.father = {i:-1 for i in range(7)}
def find(self,x):
root = x
while self.father[root] != -1: #找根节点
root = self.father[root]
while (x != root): #路径压缩
o = self.father[x] #找x的父节点
self.father[x] = root #把x的父节点设置成刚才找到的根
x = o #往上一层
return root
def merge(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
self.father[root_x] = root_y #合并
self.setSize -= 1
dic = {
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]
}
ans, nums = 7, [x for x in range(7)]
for i in range(2,8):
for j in (itertools.combinations(nums, i)):
uf = UnionFindSet(len(j))
for k in range(len(j)):
for m in range(k + 1, len(j)):
if j[m] in dic[j[k]]:
uf.merge(j[m], j[k])
if uf.setSize == 1:
ans += 1
print(ans)