采用dfs+二进制枚举。
第五题:七段码
题目描述
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
题目分析
首先给abcdefg编号为1234567
dfs用来走图,但是写一半发现dfs会重复记录(当走的方法不一样,到的每个点一样的时候就会)
所以用二进制来表示灯开关的状态,记录到数组里面
如果点亮第3号灯,我们就把 num上第三位二进制修改为1。
然后tire[二进制(000100)]=1标记一下。
#include<iostream>
using namespace std;
int g[8][8];
int sum = 0;
int tire[128];
void dfs(int n,int k,int& sum,int num)
{//0000111=7=7654灯灭321灯亮,1亮0灭
if (k == 0)
{
if (tire[num] == 0)
{
sum += 1;
tire[num] = 1;
}
return;
}
for (int i = 1;i < 8;i++)
{
if (g[n][i] && ((num & (1 << (i - 1))) == 0))//联通且没亮
dfs(i, k - 1, sum, num | (1 << (i - 1)));
}
}
int entry()
{//a b c d e f g
//1 2 3 4 5 6 7
g[1][2] = g[1][6] = 1;
g[2][1] = g[2][7] = g[2][3] = 1;
g[3][7] = g[3][2] = g[3][4] = 1;
g[4][3] = g[4][5] = 1;
g[5][4] = g[5][7] = g[5][6] = 1;
g[6][1] = g[6][7] = g[6][5] = 1;
g[7][2] = g[7][3] = g[7][5] = g[7][6] = 1;//这行没写结果错了orz
for (int k = 1;k <= 7;k++)
for (int i = 1;i < 8;i++)
{
int num = 1 << (i - 1);
dfs(i, k - 1, sum, num);
}
return sum;
}
int main()
{
cout << entry();
return 0;
}