1. 程式人生 > 其它 >七段碼

七段碼

技術標籤:Python

小藍要用七段碼數碼管來表示一種特殊的文字。

上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a, b, c, d, e, f, g。
小藍要選擇一部分二極體(至少要有一個)發光來表達字元。
在設計字元的表達時,要求所有發光的二極體是連成一片的。
例如:b 發光,其他二極體不發光可以用來表達一種字元。
例如:c 發光,其他二極體不發光可以用來表達一種字元。
這種方案與上一行的方案可以用來表示不同的字元,儘管看上去比較相似。
例如:a, b, c, d, e 發光,f, g 不發光可以用來表達一種字元。
例如:b, f 發光,其他二極體不發光則不能用來表達一種字元,因為發光的二極體沒有連成一片。

思路

並查集。。。(練了快一個月,竟然還是不熟。。。阿西吧)

from itertools import combinations
# 並查集模板
class UnionFind:
    def __init__(self, size: int):
        self.count = size
        self._father = {}
        for i in range(size):
            self._father[i] = i

        self.weight = [1] * size

    def add(self, x):
        if
x not in self._father: self._father[x] = x def find(self, x): root = x while self._father[root] != root: root = self._father[root] # 路徑壓縮 while x != root: origin_root = self._father[x] self._father[x] = root x =
origin_root return root def merge(self, x: int, y: int): root_x = self.find(x) root_y = self.find(y) if root_x != root_y: if self.weight[root_x] < self.weight[root_y]: root_x, root_y = root_y, root_x self._father[root_y] = root_x self.weight[root_x] += self.weight[root_y] self.count -= 1 if root_x == root_y: return False def is_connected(self, x, y): return self.find(x) == self.find(y) res = 0 list1 = [0, 1, 2, 3, 4, 5, 6] a = len(list1) for i in range(1, a+1): for item in (combinations(list1, i)): n = len(item) uf = UnionFind(n) for j in range(n): for k in range(j+1,n): if abs(item[j] - item[k]) == 1 or (item[j] == 0 and item[k] == 5) or (item[j] == 1 and item[k] == 6) or (item[j] == 2 and item[k] == 6) or (item[j] == 4 and item[k] == 6): uf.merge(j, k) if uf.count == 1: res += 1 print(res)

在這裡插入圖片描述