七段码2020年第十一届蓝桥杯省赛,填空题,lanqiao0J题号595
【问题描述】
七段数码管,一共有7个管,所以总共有种情况。
因为图形简单,出现的情况并不多,直接手算也行,约5~10分钟。用字符表示数码管不太方便,改用数字: a ~ g分别用1~7表示。统计亮1,2,3,4,5,6,7个灯分别有多少种情况。
这道题需要用到“联通矩阵”+“DFS(深度优先搜索)” 。
首先介绍一下联通矩阵 ,以上图为例,a只与b,f连通,所以a行的b,f列为1,其余列为0。b与a,c,g连通,所以b行的a,c,g列为1,其余列为0。以此类推,可以得到如下的矩阵。
然后深度优先搜索 (DFS)大家可以参考一下这篇文章:DFS初入门(深度优先搜索)(Python)
【手算】
这些组合中的连续亮灯,分7种情况统计:
Edge = [ # 七段码的连通矩阵
[0, 1, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 0, 1],
[0, 1, 0, 1, 0, 0, 1],
[0, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 1, 0, 1, 1],
[1, 0, 0, 0, 1, 0, 1],
[0, 1, 1, 0, 1, 1, 0]]
def dfs(k):
for i in range(7):
if Edge[k][i] and choose[i] and not visited[i]: # 连通+亮+没访问过
visited[i] = 1 # 访问了,标记为已访问
dfs(i) # 在走过的点继续走下一个
ans = 0
for i in range(1, 128): # 2^7-1=127种方案
choose = [0 for _ in range(7)] # 选择那些灯灯亮或者不亮
visited = [0 for _ in range(7)]
# 十进制(第i个方案)--》二进制choose
x = i
j = 0
while x:
if x % 2:
choose[j] = 1
x //= 2
j += 1
k = 0
# 找该方案第一个亮的灯(因为是连通的所以从任意一点都可以走到其他点)
while not choose[k]:
k += 1
visited[k] = 1 # 访问了,标记为已访问
dfs(k)
flag = True
for j in range(7):
if choose[j] and not visited[j]:# 方案选择了,但走一圈却到不了
flag = False # 这个情况不满足
break
if flag: # 方案选择了却走到了
ans += 1
print(ans) # 80