七段码
小兰用七段码数码管来表示一种特殊的文字。
上图显示了七段码数码管的图表,共有数码管 7 段能发光的二 极管,分别标记为 a,b,c,d,e,f,g。
小蓝要选择一部分二极管(至少一个)发光来表达字符。设计字符 所有发光的二极管都需要连接在一起。
例如:b 发光,其他二极管不发光可以用来表达一个字符。
例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 尽管看起来相似,但一行方案可以用来表示不同的字符。
例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一个字符。
例如:b, f 发光,其他二极管不发光,因为发光 二极管没有连成一片。
小蓝能用七段码数码管表达多少种不同的字符?
#include <iostream> using namespace std; // a b c d e f g 与下面对应 // 1 2 3 4 5 6 7 #include<cstring>//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<<ans<<endl; return 0; }