蓝桥杯-七段码

蓝桥杯-七段码_第1张图片

上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a, b, c, d, e发光,f, g 不发光可以用来表达一种字符。

例如:b, f发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

等于七段码的每一段来说都只有两种状态,亮或者不亮,所以共有128(2的7次方)种状态,我们只需枚举每一种状态,看其满不满足连在一起的要求即可。

每一种状态用一个7位二进制码表示,7位二进制码的每一位对应abcdefg中的一段,1表示该段亮,0表示该段不亮,若所有的1连着,说明亮着的所有段是连着的,即符合要求。

例如,11对应的二进制数为(0001011),所有1没有连着,说明亮着的3段没有连着,即不符合要求; 15对应的二进制数为00011111,所有1连着,说明亮着的4段是连着的,即符合要求。

首先根据七段码的图片构造二维数组如下:

bool e[7][7] = {
	{0,1,0,0,0,1,0},
	{1,0,1,0,0,0,1},
	{0,1,0,1,0,0,1},
	{0,0,1,0,1,0,0},
	{0,0,0,1,0,1,1},
	{1,0,0,0,1,0,1},
	{0,1,1,0,1,1,0}
};   //a-g的下标分别为0-6,e[0][1]表示a于b连通,本题考点是图的连通性

检测是否连通的代码如下(从第一段亮着的数码管进入)


bool dfs(int k)
{
	light[k] = 0;   //灭灯
	int i;
	for (i = 0; i < 7; ++i)
		if (light[i])  break;     //还有没灭的灯

	if (i == 7) return true;    //说明灯都灭了

	//还有没灭的灯
	for (i = 0; i < 7; ++i)
		if (e[k][i] && light[i])     
			if (dfs(i))
				return true;

	return false;
}

如果最后所有亮着的灯都能够被灭,则说明连通,否则不连通。

你可能感兴趣的:(蓝桥杯,蓝桥杯,c++)