[蓝桥杯] 七段码 python解法

【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 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)
                

你可能感兴趣的:(蓝桥杯)