Python:每日一题之七段码(并查集,dfs连通性判断)

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二 极管,分别标记为 a,b,c,d,e,f,g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一种字符。

例如:b,f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

参考代码:

def init():      #初始化
  for i in range(N):
    s[i]=i
def hebin(x,y):   #合并
  x=find_set(x)
  y=find_set(y)
  if x!=y:
    s[x]=s[y]
def find_set(x):  #查找
  if (x!=s[x]):
    s[x]=find_set(s[x])  #压缩路径
  return s[x]
def dfs(k):  # 用dfs得到灯的所有组合
  if k==8:
    cheak()
  else:
    vis[k]=1    #开灯
    dfs(k+1)    #查下一个
    vis[k]=0    #关灯
    dfs(k+1)    #查下一个
def cheak():    # dfs 判断连通性 
  global ans    #定义全局变量
  init() 
  for i in range(1,8):
    for j in range(1,8):
      if e[i][j]==1 and vis[i]==1 and vis[j]==1:  #i,j,连通,且i,j,两灯都是亮灯
        hebin(i,j)   #i,j,合并
  flag=0 
  for j in range(1,8):
    if vis[j]==1 and s[j]==j:
      flag+=1
  if flag==1:  #表明所有的灯都合并到了同一个并查集
    ans+=1

N=10
e=[[0]*N for i in range(N)]
s=[0]*N
ans=0      # 计数
vis=[0]*N  #用来标记
e[1][2]=e[1][6]=1   # 与1相邻的,下面一致
e[2][1]=e[2][7]=e[2][3]=1
e[3][2]=e[3][4]=e[3][7]=1
e[4][3]=e[4][5]=1
e[5][4]=e[5][6]=e[5][7]=1
e[6][7]=e[6][5]=e[6][1]=1
e[7][2]=e[7][3]=e[7][5]=e[7][6]=1
dfs(1)
print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值