题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 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
手残画丑图
用邻接矩阵将此图表示出来
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;
}