一、问题描述
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代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int quickin(void)
{
int ret = 0;
bool flag = false;
char ch = getchar();

最低0.47元/天 解锁文章
5396

被折叠的 条评论
为什么被折叠?



