蓝桥杯---七段码

题目描述
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?

#include
using namespace std;
const int maxn=7;
int father[maxn],ans;
bool vis[maxn],is_unicom[maxn][maxn];
void star(){
     
	is_unicom[0][1]=is_unicom[0][5]=true;
	is_unicom[1][0]=is_unicom[1][2]=is_unicom[1][6]=true;
	is_unicom[2][1]=is_unicom[2][3]=is_unicom[2][6]=true;
	is_unicom[3][2]=is_unicom[3][4]=true;
	is_unicom[4][3]=is_unicom[4][5]=is_unicom[4][6]=true;
	is_unicom[5][0]=is_unicom[5][4]=is_unicom[5][6]=true;
	is_unicom[6][1]=is_unicom[6][2]=is_unicom[6][4]=is_unicom[6][5]=true;
}
int find_root(int x){
     
	int i=x;
	while(x!=father[x])x=father[x];
	while(i!=father[i]){
     
		int temp=i;
		i=father[i];
		father[temp]=x;
	}
	return x;
}
void Union(int a,int b){
     
	int A=find_root(a),B=find_root(b);
	if(A!=B)father[A]=B;
}
void dfs(int i){
     
	if(i==maxn){
     
		for(int i=0;i<maxn;i++)father[i]=i;
		for(int i=0;i<maxn;i++)
			for(int j=0;j<maxn;j++)
				if(is_unicom[i][j]&&vis[i]&&vis[j])Union(i,j);
		int sum=0;
		for(int i=0;i<maxn;i++)if(vis[i]&&i==father[i])++sum;
		if(sum==1)++ans;
		return;
	}
	vis[i]=true;dfs(i+1);
	vis[i]=false;dfs(i+1);
}
int main(){
     
	star();
	dfs(0);
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(蓝桥杯---七段码)