蓝桥杯——七段码

283 阅读2分钟

题目描述

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

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

图片描述

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

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

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

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

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

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

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

运行限制

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

这七个数字形成一个联通图,

v

image.png 手残画丑图

用邻接矩阵将此图表示出来

int graph[7][7]={
    //用邻接矩阵表示联通图
//   a,b,c,d,e,f,g
    {1,1,0,0,0,1,0},//a
    {1,1,1,0,0,0,1},//b
    {0,1,1,1,0,0,1},//c
    {0,0,1,1,1,0,0},//d
    {0,0,0,1,1,1,1},//e
    {1,0,0,0,1,1,1},//f
    {0,1,1,0,1,1,1}//g
  };

以下AC码

#include<iostream>
#include<cstdio>
using namespace std;
int graph[7][7]={
    //用邻接矩阵表示联通图
//   a,b,c,d,e,f,g
    {1,1,0,0,0,1,0},//a
    {1,1,1,0,0,0,1},//b
    {0,1,1,1,0,0,1},//c
    {0,0,1,1,1,0,0},//d
    {0,0,0,1,1,1,1},//e
    {1,0,0,0,1,1,1},//f
    {0,1,1,0,1,1,1}//g
  };
  #define itn int
int ans=127;
itn bright[7],vis[7];
void dfs(itn now)
{
    for(int i=0;i<7;i++)
    {
        if(graph[now][i]&&!vis[i]&&bright[i])
        {
            vis[i]=1;
            dfs(i);
        }
    }


    return ;
}
int main()
{

    for(int i=1;i<=127;i++)
    {
        for(itn i=0;i<7;i++)
        {
            bright[i]=0;
            vis[i]=0;//每轮开始重设两个记录数组
        }
        itn t=i,j=0;
        
        while(t>0)
        {
            if(t%2)
            {
                bright[j]=1;//将灯数组记录,1表示亮,0表示不亮
             
            }
            t/=2;
            j++;
        }
        itn k=0;
        while(!bright[k])k++;//找到第一个亮的灯
        vis[k]=1;
        dfs(k);
        for(itn i=0;i<7;i++)
        {
            if(bright[i]&&!vis[i])
            {
                ans--;
                break;
            }
        }//判断是否完全亮灯
     
      
    }
    cout<<ans<<endl;



    return 0;    
}