七段碼
阿新 • • 發佈:2021-02-07
技術標籤: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)