题目描述
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。请问,小蓝可以用七段码数码管表达多少种不同的字符?
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
using namespace std;
vector<int> h[7];
int st[7];
bool check[10000];
int cnt;
int dfs(int x)
{
st[x]=1;
int m=st[0];
for(int i=1;i<7;i++)
{m=(m<<1)+st[i];}
if(!check[m]) cnt++;
check[m]=1;
for(int t:h[x])
{
if(!st[t]){
dfs(t);
st[t]=0;}
}
return 0;
}
int main()
{
const int a=0,b=1,c=2,d=3,e=4,f=5,g=6;
h[a].push_back(f);h[a].push_back(b);
h[b].push_back(a); h[b].push_back(g); h[b].push_back(c);
h[c].push_back(b); h[c].push_back(g); h[c].push_back(d);
h[d].push_back(e); h[d].push_back(c);
h[e].push_back(f); h[e].push_back(g); h[e].push_back(d);
h[f].push_back(a); h[f].push_back(g); h[f].push_back(e);
h[g].push_back(f); h[g].push_back(b); h[g].push_back(e); h[g].push_back(c);
for (int i = a; i <=g ; i ++ )
{ dfs(i);
memset(st, 0, sizeof st);}
cout<<cnt;
}
结果
80