试题E:七段码
【问题描述】
上图显示了七段码数码管的图表,共有数码管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发光,其他二极管不发光,因为发光 二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
答案:80种
#include<iostream> #include<algorithm> #include<vector> #include<set> using namespace std; vector<int> g[10]; set<int> res; bool vis[10]; int idx; //将tmp插入a,让a的每一个人都大到小(只有有序形成) int getNewNum(int a,int tmp){ int b = 0; while(a && a < tmp){ b = b*10 a; a /= 10; } a = a*10 tmp; while(b){ a = a*10 b; b/=10; } return a; } void dfs(int x,int num){ for(int tmp:g[x]){ if(!vis[tmp]){ int a = getNewNum(num,tmp); res.insert(a); vis[tmp] = true; dfs(tmp,a); vis[tmp] = false; } } } int main(){ int m; cin>>m; for(int i = 1; i <= m; i ){ int u,v; cin>>u>>v; //构建邻接表,矩阵也可以相邻 g[u].push_back(v); g[v].push_back(u); } for(int i = 1; i <= 7; i ){ fill(vis,vis 10、0);//初始化; dfs(i,0); } printf("共有%d种\n",res.size()); printf("****************以下是所有组合***********\n"); for(int x:res){ cout<<x<<'\n'; } return 0; } /* 10 1 2 1 3 2 4 3 4 2 5 3 6 4 5 4 6 5 7 6 7 */