[蓝桥杯 2020 省 B2] 试题 E:七段码

一、问题描述

P8714 [蓝桥杯 2020 省 B2] 试题 E:七段码

二、问题简析

我们可以把该数码管看成一张图:将二极管作为顶点,并编号(1~7);若二极管相邻,则对应的顶点有无向边连接。这样,我们就得到了一张7个顶点的无向图。题目要我们求,该图的连通子图的数量。
连通子图 :在无向图 G G G 中,若任意两个顶点之间都存在路径使得它们相连通,则称 G G G 为连通图。

我们可以分两步走:第一步,遍历该图的所有子图;第二步,检验子图的连通性。

2.1 遍历子图

在遍历子图时,可以利用掩码 来简化运算。将二进制的第 0 位与顶点 1 对应,第 1 位与顶点 2 对应 ······ 以此类推,7 个顶点一共要用 7 个二进制位表示。若某个二进制位是 0,表示子图中没有对应的顶点;若为 1,则有该顶点。

因此,我们可以遍历二进制位,来达到遍历子图的目的 。因为二进制可以转换为十进制,所以可以通过递遍历十进制来达到遍历二进制的目的。

遍历十进制肯定不能无限制地递增下去,要确定一个上限。若 7 个二进制位都为 1,换算成十进制就是 2^7 - 1,这就是上限。进行指数运算的复杂度较高,我们给该上限 +1,变成了 2^7,可以直接通过位操作 1 << 7 表示。

2.2 检验连通性

这里采用 dfs 来检验连通性。


三、AC代码

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

bool vis[10], A[10], G[10][10];

int dfs(int x)
{
	if (!A[x] || vis[x])
		return 0;
	int ret = 1;
	vis[x] = true;
	for (int i = 1; i <= 6; i++)
	{
		if (G[x][i])
			ret += dfs(i);
	}
	return ret;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
//	freopen("test.out", "w", stdout);
	#endif
	
	for (int i = 0; i < 10; i++)
	{
		int a, b;
		cin >> a >> b;
		G[a][b] = true;
		G[b][a] = true;
	}
	
	ll ans = 0;
	for (int i = 1; i < (1 << 7); i++)
	{
		fill(A, A + 10, false);
		fill(vis, vis + 10, false);
		int cnt = 0, st;
		for (int j = 1; j <= 7; j++)
			if ((i >> (j - 1)) & 1)
			{
				A[j] = true;
				st = j;
				cnt++;
			}	
		
		if (dfs(st) == cnt)
		{
			ans++;
//			for (int j = 1; j <= 6; j++)
//				if (A[j])    cout << j << ' ';
//			cout << endl;
		}
	}
	cout << ans << endl;
	
	return 0;
}
相关推荐
6Hzlia29 分钟前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香1 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut1 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
foundbug9993 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
memcpy04 小时前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog1235 小时前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
AI科技星5 小时前
灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
晓觉儿5 小时前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论
We་ct5 小时前
LeetCode 322. 零钱兑换:动态规划入门实战
前端·算法·leetcode·typescript·动态规划