上图给出了七段码数码管的一个图示,数码管中一共有 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;
}
如果最后所有亮着的灯都能够被灭,则说明连通,否则不连通。