七段碼(藍橋杯真題)——python求解
阿新 • • 發佈:2021-02-07
題目如下:
小藍要用七段碼數碼管來表示一種特殊的文字。
上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a, b, c, d, e, f, g。
小藍要選擇一部分二極體(至少要有一個)發光來表達字元。
在設計字元的表達時,要求所有發光的二極體是連成一片的。
例如:b 發光,其他二極體不發光可以用來表達一種字元。
例如:c 發光,其他二極體不發光可以用來表達一種字元。
這種方案與上一行的方案可以用來表示不同的字元,儘管看上去比較相似。
例如:a, b, c, d, e 發光,f, g 不發光可以用來表達一種字元。
請問,小藍可以用七段碼數碼管表達多少種不同的字元?
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。
本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
解答
這道題採用dfs和並查集進行解決,用並查集進行判斷是否連通,用dfs進行深度搜索:
並查集的python介紹與實現
import numpy as np
result = 0
parent = [0 for _ in range(7)]
m = [0 for _ in range(7)]
e = np.zeros( (7, 7))#我們首先利用圖來建立一個聯通關係,可以連通的我們標記為1
#我們用0123456代替abcdefg
e[0][1] = e[0][5] = 1
e[1][0] = e[1][6] = e[1][2] = 1
e[2][1] = e[2][3] = e[2][6] = 1
e[3][2] = e[3][4] = 1
e[4][3] = e[4][5] = e[4][6] = 1
e[5][0] = e[5][4] = e[5][6] = 1
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
return x
def union(x1, x2):
root_x, root_y = find(x1), find(x2)
if root_x != root_y:
parent[root_x] = root_y
#上面兩個並查集模板
def sumX(a):
global result
#在這裡並不是優先進行,優先進行下面的dfs
if a > 6:
for i in range(7):
parent[i] = i
for i in range(7):
for j in range(7):
#滿足條件連結時我們連線兩者
if e[i][j] and m[i] and m[j]:
union(i, j)
k = 0
for i in range(7):
#判斷是否只有一條路聯通
if m[i] and parent[i] == i:
k += 1
if k == 1:
result += 1
return
#不斷地往下計算,把所有情況全部包括
m[a] = 1
sumX(a+1)
m[a] = 0
sumX(a+1)
sumX(0)#我們從第一個開始進行dfs
print(result)
答案:80