七段码(蓝桥杯)

文章目录

  • 七段码
    • 题目描述
    • 答案:80
    • 分析
      • 编程求解:有多种方法
        • 方法一:状态压缩+枚举+构图(以二极管为顶点)+DFS判断连通
        • 代码
        • 方法二:bfs

七段码

题目描述

小蓝要用七段码数码管来表示一种特殊的文字。
在这里插入图片描述

上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。

例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

答案:80

分析

手工求解:容易遗漏,本题不宜采用。

编程求解:有多种方法

方法一:状态压缩+枚举+构图(以二极管为顶点)+DFS判断连通
  1. 状态压缩:一共才7段二极管,每段二极管都可以选或不选(全部不选不行),所以总共有27-1=127种方案,把1~127范围内的每个数转换成二进制,就对应到一种方案。
    例如,(23)10=(0010111)2,表示a,b,c,e选,其他二极管不选。
  2. 枚举每个方案,看是否符合要求。
  3. 构图:以二极管为顶点,二极管相邻则连边。
  4. DFS判断连通:对每一种方案,从该方案中任何一个选中的顶点出发进行DFS,跳过那些没有选中的顶点,DFS完毕,如果所有选中的顶点都遍历到,则说明是连通的,是一种符合题目要求的方案。

在这里插入图片描述

方法重点:DFS、构图。
特征:方案,计数
核心思路:枚举所有方案,对预设的方案,通过关联等条件搜索DFS能覆盖此方案中所有亮的二极管,那么此方案计入方案数。

代码

这段代码的目的是计算可以用七段数码管表示的、所有发光的二极管连成一片的不同字符的数量。下面是对代码的详细注释:

#include<bits/stdc++.h>
using namespace std;// 定义七段数码管中各个段之间的连接关系
int g[7][7] = {0,1,0,0,0,1,0, // a段1,0,1,0,0,0,1, // b段0,1,0,1,0,0,1, // c段0,0,1,0,1,0,0, // d段0,0,0,1,0,1,1, // e段1,0,0,0,1,0,1, // f段0,1,1,0,1,1,0  // g段
};// d数组用于标记当前方案中哪些段是亮的
int d[7];
// v数组用于标记在深度优先搜索中已经访问过的段
int v[7];// 深度优先搜索函数,用于搜索所有与start相连的亮段
void dfs(int start) {for(int i = 0; i < 7; i++) {// 如果当前段i与start相连,且i段是亮的,且之前没有访问过i段if(g[start][i] == 1 && d[i] == 1 && v[i] == 0) {v[i] = 1; // 标记i段为已访问dfs(i); // 递归调用dfs,继续搜索从i段出发的相连亮段}}
}int main() {int ans = 127; // 初始化答案为所有可能的组合数,即2^7 - 1(减1是因为至少有一个段是亮的)for(int i = 1; i <= 127; i++) { // 遍历所有可能的组合memset(d, 0, sizeof(d)); // 重置d数组为全0,表示所有段初始都是灭的memset(v, 0, sizeof(v)); // 重置v数组为全0,表示没有段被访问过int x = i, j = 0; // x为当前二进制数,j为当前位的索引// 将i的二进制表示分解为一个个位,并存储到d数组中while(x) {d[j++] = x % 2; // 存储当前位的亮灭状态x /= 2; // 移除已处理的位}// 找到第一个亮的段作为搜索的起点int start = 0;while(d[start] == 0) start++;v[start] = 1; // 标记起点为已访问dfs(start); // 从起点开始深度优先搜索// 检查是否所有的亮段都已经被访问过for(int j = 0; j < 7; j++) {if(d[j] == 1 && v[j] == 0) {ans--; // 如果有亮的段没有被访问过,说明当前方案不合法,答案减一break; // 跳出循环,继续下一个组合}}}cout << ans; // 输出最终的合法组合数return 0;
}

这段代码通过二进制的方式来表示每个字符的七段数码管的亮灭状态,然后通过深度优先搜索(DFS)来检查每个可能的组合是否满足题目中的条件(所有发光的二极管是连成一片的)。如果一个组合不满足条件,它会被排除,最终输出符合条件的字符数量。

方法二:bfs

这段代码的目的是使用广度优先搜索(BFS)来解决一个问题,具体来说,是计算在一个给定的图形(由七个点组成)中,有多少种方式可以使得所有点亮的点连成一片。这个问题可以通过检查每个点的连接性来解决。下面是对代码的详细注释:

#include<bits/stdc++.h>
using namespace std;// ans用于记录连成一片的点亮点的数量
int ans;
// g[7][7]是一个二维数组,用于表示图形中点之间的连接关系
int g[7][7];
// vis[7]是一个数组,用于标记在BFS过程中已经访问过的点
int vis[7];
// flag[7]是一个数组,用于标记在检查过程中哪些点是亮的
int flag[7];// BFS函数用于广度优先搜索,确定一个点是否连通其他亮的点
void bfs(int x){queue<int> que; // 定义一个队列用于BFSque.push(x); // 将起点x入队vis[x] = true; // 标记x为已访问while(!que.empty()){ // 当队列不为空时循环int u = que.front(); // 取出队列前端的点que.pop(); // 将该点从队列中移除for(int i = 0 ; i <= 6 ; i ++){ // 遍历所有与u相连的点if(g[u][i] && flag[i] && !vis[i]){ // 如果该点与u相连,且该点是亮的,且未被访问过vis[i] = true; // 标记为已访问que.push(i); // 将该点入队,继续BFS}}}
}// check函数用于检查一个给定的二进制编码x是否表示一个连通的图形
bool check(int x){for(int i = 0 ; i <= 6 ; i ++) // 初始化flag和vis数组flag[i] = vis[i] = false;int cnt = 0; // 用于计数连通分量的数量for(int i = 6 ; ~i ; i --) // 遍历x的每一位if(x >> i & 1) flag[i] = true; // 如果某一位为1,则标记对应的点为亮的for(int i = 0 ; i <= 6 ; i ++){ // 再次遍历每个点if(flag[i] && !vis[i]){ // 如果点是亮的,但还未被访问bfs(i); // 执行BFScnt ++ ; // 连通分量数量加一}}return cnt == 1; // 如果只有一个连通分量,返回true
}int main()
{// 初始化g数组,表示图形中点之间的连接关系g[0][1] = g[0][5] = 1;g[1][0] = g[1][2] = g[1][6] = 1;g[2][1] = g[2][3] = g[2][6] = 1;g[3][2] = g[3][4] = 1;g[4][3] = g[4][5] = g[4][6] = 1;g[5][0] = g[5][4] = g[5][6] = 1;g[6][1] = g[6][2] = g[6][4] = g[6][5] = 1;// 遍历所有可能的二进制编码(0到127)for(int i = 0 ; i < (1 << 7) ; i ++){if(check(i)) { // 如果当前编码表示一个连通的图形ans ++ ; // 答案加一}}cout << ans << '\n'; // 输出答案return 0;
}

这段代码通过二进制编码来表示每个点的亮灭状态,然后使用BFS来检查每个点是否连通其他亮的点。check函数用于确定一个给定的编码是否表示一个连通的图形。如果是,那么答案ans就会增加。最后,程序输出所有可能的连通图形的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试题---->JavaScript

const声明的对象属性和数组的值可以被修改吗&#xff1f;为什么 原因&#xff1a;当使用const声明一个对象或数组时&#xff0c;实际上是保证了对象或数组的引用不会被修改&#xff0c;但对象或数组本身的属性或元素是可以被修改的。这是因为const只能保证指向的内存地址不变&a…

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML、CSV&#xff09;&#xff0c;或者数据库中&#xff0c;实现脚本与数据解耦&#xff0c;方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…

c++AVL树

cAVL树 1. 前言 map/multimap、set/multiset这几个容器的共同点是&#xff1a;它们的底层都是按照搜索二叉树来实现的&#xff0c;但是搜索二叉树存在一个缺陷&#xff1a;如果往树中插入的元素有序或接近有序&#xff0c;二叉树搜索就会退化成单支树&#xff0c;时间复杂度会…

Vuex笔记

Vuex vuex 是实现数据集中式状态管理的插件。数据由 vex 统一管理。其它组件都去使用 vuex 中的数据。只要有其中一个组件去修改了这个 共享的数据&#xff0c;其它组件会同步更新。 多个组件之间依赖于同一状态。来自不同组件的行为需要变更同一状态。 环境搭建 1、vue2安…

Linux虚拟机环境搭建spark

Linux环境搭建Spark分为两个版本&#xff0c;分别是Scala版本和Python版本。 一、 安装Pyspark 本环境以 Python 环境为例。 1、下载spark 下载网址&#xff1a;https://archive.apache.org/dist/spark 下载安装包&#xff1a;根据自己环境选择合适版本&#xff0c;本环境…

BitMap介绍与应用

文章目录 BitMapBitMap介绍BitMap 结构RoaringBitmap 常见BitMapJava中的BitSetRedis中的BitMapClickHouse中的BitMap BitMap应用案例人群圈选 BitMap 场景一&#xff1a;(大部分开发面试都会遇到的一个问题&#xff09; 有10亿个用户id (int类型)&#xff0c;判断用户是否登…

自养号测评:如何助力跨境电商平台亚马逊、速卖通等店铺提升产品权重

对于卖家而言&#xff0c;爆款产品不仅意味着源源不断的流量&#xff0c;更是店铺销量增长的强有力保障。因此&#xff0c;多数卖家都积极学习如何打造爆款产品&#xff0c;特别是那些希望将店铺运营得风生水起的卖家们。那么&#xff0c;如何在激烈的市场竞争中打造出具有创新…

题解 P3295 【[SCOI2016]萌萌哒】

先引用一下这位大佬的题解&#xff0c;对此我再进行细化 题解 P3295 【[SCOI2016]萌萌哒】 - 洛谷专栏https://www.luogu.com.cn/article/it7foeu6并查集 首先是如何想出来需要并查集处理&#xff0c;下面是n8&#xff0c;第一组约束条件是[1,4]和[5,8]&#xff0c;如下图&am…

算法的时间复杂度与空间复杂度

俗话说“条条大路通罗马”&#xff0c; 我们在用算法解决某一个问题时&#xff0c;往往会存在多种解决方法&#xff0c;但正如道路有远近之分&#xff0c;不同的算法也应该是有优劣的。为了更加清晰的量化算法的优劣&#xff0c;我们就需要引入算法的时间复杂度与空间复杂度了。…

我的 Android 性能书上架了!内附书籍介绍

大家好&#xff0c;我是拭心。 很高兴地向大家宣布&#xff0c;我的新书《Android 性能优化入门与实战》上架了&#xff01; 点击下面的小程序进行购买&#xff1a; 封面介绍 这本书的封面来自之前的投票文章 # 投票啦&#xff01;最新安卓进阶书籍封面由你来定&#xff0c;从四…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇&#xff1a; 欢迎来到设计模式的神秘…

Unity 打包真机脚本丢失的问题

记录Bug Bug详情分析解决方案附录 Bug详情 项目中导入了UI Particle的Package,用于处理特效层级 unity 运行效果正常&#xff0c;打包真机后运行时发现特效并没有正确显示&#xff0c;真机Log如下图 需要接入查看真机Log工具的点这里 查看图中Log发现对应的Prefab上挂载的脚本…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员职业生涯的分水岭&#xff1a;年龄还是经验&#xff1f;引言技术更新换代…

邮件营销工具的必备功能?如何选营销工具?

邮件营销工具的效果如何&#xff1f;营销工具怎么提升邮件营销&#xff1f; 一款优秀的邮件营销工具&#xff0c;不仅能够帮助企业高效地进行邮件发送&#xff0c;还能通过精准的数据分析和用户行为跟踪&#xff0c;提升营销效果。AokSend将探讨邮件营销工具的必备功能。 邮件…

Python机器学习赋能GIS:地质灾害风险评价的新方法论

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

鉴源论坛丨形式化工程方法之需求建模(下)

作者 | 杨坤 上海控安可信软件创新研究院系统建模组 版块 | 鉴源论坛 观模 引言&#xff1a;需求建模是一种从源头确保软件质量的重要手段。需求建模可分为需求规约和需求确认两个部分&#xff0c;前者通过严格设计的形式化语言精确地将需求文档转换为了形式化规约&#xff0…

PASSL代码解读[01] readme

介绍 PASSL 是一个基于 PaddlePaddle 的视觉库&#xff0c;用于使用 PaddlePaddle 进行最先进的视觉自监督学习研究。PASSL旨在加速自监督学习的研究周期&#xff1a;从设计一个新的自监督任务到评估所学的表征。 PASSL 主要特性&#xff1a; 自监督前沿算法实现 PASSL 实现了…

为什么requests不是python标准库?

在知乎上看到有人问&#xff1a;为什么requests不是python标准库&#xff1f; 这确实是部分人困惑的问题&#xff0c;requests作为python最受欢迎的http请求库&#xff0c;已经成为爬虫必备利器&#xff0c;为什么不把requests直接装到python标准库里呢&#xff1f;可以省去第…

学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟&#xff0c;首先要下载joy功能包&#xff0c;发布sensor_msgs话题也就是手柄和ros通信的话题。 下载的步骤就根据官方文档即可 joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki 这里我提供一下具体步骤 第一步 安装joy 首先安装对应系统版本的…

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据&#xff0c;有一元运算符和二元运算符之分。 一元算术运算符有两个&#xff1a;&#xff08;正号&#xff09;和-&#xff08;负号&#xff09;&#xff0c;例如&#xff1…