1. 程式人生 > 其它 >七段碼(藍橋杯真題)——python求解

七段碼(藍橋杯真題)——python求解

技術標籤:經驗分享python演算法

題目如下:
小藍要用七段碼數碼管來表示一種特殊的文字。
在這裡插入圖片描述

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

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

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

解答

這道題採用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