2022-2-24
时间:2023-11-14 03:37:02
七段码
题目描述
小兰用七段码数码管来表示一种特殊的文字。
上图显示了七段码数码管的图表,共有数码管 7 段能发光的二 极管,分别标记为 a,b,c,d,e,f,g。
小蓝要选择一部分二极管(至少一个)发光来表达字符。设计字符 所有发光的二极管都需要连接在一起。
例如:b 发光,其他二极管不发光可以用来表达一个字符。
例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 尽管看起来相似,但一行方案可以用来表示不同的字符。
例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一个字符。
例如:b, f 发光,其他二极管不发光,因为发光 二极管没有连成一片。
小蓝能用七段码数码管表达多少种不同的字符? 80
一:枚举
亮1个==亮6个(任意一个):7(a,b,c,d,e,f,g)
全亮:1(abcdefg)
亮2个:10 (ab,af,bc,bg,cd,cg,de,eg,ef,fg)
亮3个:16 (abc,abg,afe,afg,bcd,bgf,bgc,bge,cdg,cde,cgf,cge,deg,def,egb,egf)
按照上面两个亮的顺序加一个,依次进行。不容易少。
亮4个:20 (abcd,abcg,abgf,abge,afed,afeg,afgc,afgb,bcde,bcdg,bgfe,bgfc,bgce,bged,cdge,cdgf,cdef,cgfe,degb,degf)
亮5个:19 后面越来越容易出错(abcde,abcdg,abcdf,abcge,abcgf,abgfe,abged,afedc,afedg,afegc,afgcd,afgcb,bcdef,bcdeg,bcdgf,bgfed,bgfec,cdgef,degbf)
共 7 7 1 10 16 20 19=80
代码:
#include using namespace std; // a b c d e f g 与下面对应 // 1 2 3 4 5 6 7 #include//memset()函数 int e[7][7]={
{0,0,0,0,0,1,0}, {1,0,1,0,0,0,0,1}, {0,1,0,1,0,0,0,1}, {0,0,1,0,1,0,0 {0,0,0,1,0,1,1,1 {1,0,0,0,0,1,0,1,0,1}, {0,1,1,0,1,1,0}; int choose[7];//对一方案:若i在此方案中,choose[i]=1 int vis[7];//dfs中,记录顶点是否访问过的标志 void dfs(int k){ for(int i=0;i<7;i ){//i和k相邻,i它包含在计划中,i没有访问 if(e[k][i]&&choose[i]&&!vis[i]){ vis[i]=1; dfs(i); } } } int main() { int i,j,k,x,ans=127;//2进制1111111 for(int i=1;i<=127;i ){ memset(choose,0,sizeof(choose)); memset(vis,0,sizeof(vis));//清零 x=i;j=0; while(x){ if(x%2) choose[j]=1; x/=2; j ;//j记录位置 } k=0; while(choose[k]==0) k ;////在计划的顶点找到一个包含在内的 vis[k]=1; dfs(k); for(j=0;j<7;j ){ if(choose[j]&&vis[j]==0) break; } if(j<7) ans--; } cout<