1. 程式人生 > 其它 >[藍橋杯]七段碼(Python 實現)

[藍橋杯]七段碼(Python 實現)

技術標籤:algorithmalgorithm

題目:

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

例如:b, f 發光,其他二極體不發光則不能用來表達一種字元,因為發光的二極體沒有連成一片。
請問,小藍可以用七段碼數碼管表達多少種不同的字元?

【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。
本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

程式碼:

import itertools
class UFS:
    def __init__(self,n):
        self.count=0
        self.father=[x for x in range(n)]
    def find(self,x):
        root=
x while self.father[root]!=root: root=self.father[root] return root def union(self,x,y): x,y=self.find(x),self.find(y) if x!=y: self.father[y]=x self.count+=1 return 0 result=0 nums=[x for x in range(7)] for x in range(1,8
):#每次用的電晶體的個數 for k in (itertools.combinations(nums,x)):#從所有的電晶體中按個數要求不重複的拿。 l=len(k)#電晶體的個數 ufs=UFS(l) #兩兩的逐個選取。 for a in range(l): for b in range(a+1,l): #根據下圖的數字判斷兩個電晶體是否相鄰。 if abs(k[a]-k[b])==1 or (k[a]==1 and k[b]==6) or (k[a]==2 and k[b]==6) or (k[a]==4 and k[b]==6) or (k[a]==0 and k[b]==5): ufs.union(a,b) if l-ufs.count==1:#比如當用到三個二極體的時候只需要連結兩次,那麼當晶體管個數減去連結次數為1的時候符合要求。 result+=1 print(result)

在這裡插入圖片描述
結果:80