试题E 七段码(T5)
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,分别标记为a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
答案:80
#include "stdio.h"
#include <bits/stdc++.h>
#include<iostream>
#include<set>
using namespace std;
set<int> s;
int arr[7][7]={0};
set<int> s2;
void dfs(int n)
{
s.insert(n);
//cout<<n<<"\t";
for(int i=0;i<7;i++)
if(arr[n][i]==1 && s.count(i)==0 && s2.count(i)>0)
dfs(i);
}
int compare(set<int> s1,set<int> s2)
{
if (s1.size() != s2.size()){
return 0;
}
set<int>::iterator it;
set<int>::iterator it1;
//遍历集合中的所有元素
for (it = s1.begin(), it1 = s2.begin(); it != s1.end(); it++, it1++){
if (*it1 != *it){
return 0;
}
}
return 1;
}
int ten2bin(int h)
{ //cout<<h<<"\t";
int j=h;
s2.clear();
s.clear();
int start=0;
for(int j=7;j>=0;j--)
{
if(pow(2,j)<=h)
{start=j;
h-=pow(2,j);
s2.insert(j);
}
}
dfs(start);
if(compare(s,s2)==1)
return 1;
return 0;
}
int main()
{
arr[0][1]=arr[0][5]=1;
arr[1][0]=arr[1][2]=arr[1][6]=1;
arr[2][1]=arr[2][6]=arr[2][3]=1;
arr[3][2]=arr[3][4]=1;
arr[4][3]=arr[4][5]=arr[4][6]=1;
arr[5][0]=arr[5][4]=arr[5][6]=1;
arr[6][1]=arr[6][2]=arr[6][4]=arr[6][5]=1;
int sum=0;
for(int i=1;i<=127;i++)
{
sum+=ten2bin(i);
}
cout<<sum<<endl;
return 0;
}