0
点赞
收藏
分享

微信扫一扫

七段码(dfs+二进制枚举)

心如止水_c736 2022-03-11 阅读 99

采用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;
}

 

举报

相关推荐

0 条评论