七段码(蓝桥杯)

文章目录

  • 七段码
    • 题目描述
    • 答案: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; // 定义一个队列用于BFS
    que.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); // 执行BFS
            cnt ++ ; // 连通分量数量加一
        }
    }
    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就会增加。最后,程序输出所有可能的连通图形的数量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win11 环境配置 之 Jmeter

一、安装 JDK 1. 安装 jdk 截至当前最新时间&#xff1a; 2024.3.27 jdk最新的版本 是 官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下&#xff0c;新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…

自动化测试框架Taffy

Taffy Taffy是基于nosetests的自动化测试框架。 Taffy主要用来测试后台服务(包括且不限于Http, Dubbo/hessian, Webservice, Socket等类型接口)&#xff0c;也可集成Selenium, Appium进行WEB或APP的自动化测试&#xff0c;或集成locust进行性能测试。 Taffy封装实现了结果对…

Typora 主题配置

title: Typora主题配置 search: 2024-03-19 tags: “#Typora主题” Typora 主题配置 文章目录 Typora 主题配置Step-1 进入官方主题网站Step-2 选中主题&#xff0c;并点击DownloadStep-3 跳转到 github 网站Step-4 直接下载源码Step-5 解压下载的源码Step-6 找到下载源码中的…

搜索树概念及操作

目录 一. .搜索树 1.1 概念 1.2 操作1 查找 1.3 操作2 插入 1.4 操作3 删除 1.5 性能分析 1.6 和 java 类集的关系 一. .搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#x…

Automatic Prompt Engineering

让大模型自己生成prompt&#xff0c;生成提示&#xff08;prompt&#xff09;存在两种不同的操作方式。第一种方式是在文本空间中进行&#xff0c;这种提示以离散的文本形式存在。第二种方式是将提示抽象成一个向量&#xff0c;在特征空间中进行操作&#xff0c;这种提示是抽象…

二进制日志备份与恢复

二进制备份是 MySQL 数据库备份的一种方式&#xff0c;它通过记录数据库的所有更改操作&#xff0c;以二进制格式保存&#xff0c;实现对数据库的增量备份和恢复。binlog_format 是 MySQL 中用来指定二进制日志格式的参数&#xff0c;有三种常见的选项&#xff1a;STATEMENT、R…

【PLC】PROFIBUS(二):总线协议DP、PA、FMS

1、总线访问协议 (FDL) 1.1、多主通信 多个主设备间&#xff0c;使用逻辑令牌环依次向从设备发送命令。 特征&#xff1a; 主站间使用逻辑令牌环、主从站间使用主从协议主站在一个限定时间内 (Token Hold Time) 对总线有控制权从站只是响应一个主站的请求它们对总线没有控制…

spring-boot-devtools配置和原理

一、前言 昨天&#xff0c;一个同事Eclipse在启动SpringBoot项目时一直不停地加载&#xff0c;后来发现是因为spring-boot-devtools造成的问题&#xff0c;因为我们把日志输出的目录设置在当前项目里&#xff08;~/mnt/logs/&#xff0c;这样设置是因为mac电脑没有根目录权限&…

Django之Web应用架构模式

一、Web应用架构模式 在开发Web应用中,有两种模式 1.1、前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示。前端与后端的耦合度很高 1.2、前后端分离 在前后端分离的应用模式中,后端仅返…

树状数组的三种代码模板

下标从一开始。 所有奇数等于本身&#xff0c;偶数/2等于所在层数。 二进制末尾有几个0就在第几层。 每一个树状数组中表示的都是这么一个区间的和&#xff0c;左开右闭。 写成lowbit(x)&#xff0c;返回的就是2^k&#xff0c;k就是末尾有几个0。 这是求和代码 单点修改 这是…

案例 | 华院计算x第一财经:我和我的数智人唱双簧

创新关乎命运&#xff0c;科技引领未来。生成式人工智能(AIGC)给传媒行业发展带来严峻挑战的同时&#xff0c;也带来千载难逢的重大发展机遇。2024年政府工作报告中提出&#xff0c;要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际…

龙泉寺扫地僧:十年坚持打造轻量级浏览器内核

王斌&#xff0c;网名龙泉寺扫地僧。作为一个独立开发者&#xff0c;他专注于浏览器内核研究十余年。他主要从事 MiniBlink 项目的工作&#xff0c;旨在创建一个精简且高效的浏览器内核&#xff0c;应对 Chromium 庞大的体积和内存占用问题。 龙泉寺扫地僧在谈及做 MiniBlink 的…

10个你必须知道的浏览器指纹检测工具,保护你的隐私安全

在当前的数字时代&#xff0c;个人隐私保护变得越来越重要&#xff0c;特别是对于互联网用户来说。有一种叫做“浏览器指纹”的技术&#xff0c;它能悄悄收集我们使用的浏览器和设备的各种细节信息。这本是为提供个性化服务&#xff0c;但对那些需要在不同平台同时管理多个账号…

11.数据库技术(下)

1.select语句 中括号表示可有可无&#xff1b; 尖括号表示变量名&#xff1b; 分组后再筛选&#xff0c;用having&#xff1b;分组前筛选&#xff0c;用where&#xff1b; select后跟随的所有列&#xff0c;除聚集函数外&#xff0c;都需要列在group by后&#xff1b; 注&…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

HarmonyOS应用/元服务发布流程

在发布HarmonyOS应用/元服务前&#xff0c;建议您在本地进行调试&#xff0c;以查看和验证应用/元服务运行效果&#xff0c;减少发布过程中可能遇到的问题。 华为支持您使用HUAWEI DevEco Studio自动化签名的方式对应用/元服务进行调试&#xff0c;总体流程如下。 配置签名信息…

蓝桥杯练习系统(算法训练)ALGO-967 共线

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定2维平面上n个整点的坐标&#xff0c;一条直线最多能过几个点&#xff1f; 输入格式 第一行一个整数n表示点的个数   …

c语言--跳出continue、break

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止&#xff0c;continue 会跳过当前循环中的代码&#xff0c;强迫开始下一次循环。 对于 for 循环&#xff0c;continue 语句执行后自增语句仍然会执行。对于 while 和 do…while 循环&#xff0c;continue 语句重新…

CI860K01 3BSE032444R1 参数说明书

ABB CI860K01 3BSE032444R1是一款ABB公司生产的通信接口模块。 这款模块是专为工业自动化环境设计的&#xff0c;能够在各种设备之间提供稳定和可靠的数据传输接口。它采用了先进的通信技术和严格的生产工艺&#xff0c;确保了产品的高质量和性能。此外&#xff0c;它的设计合…

antdp | 菜单展示-菜单路由配置

扩展的路由配置 Layout 插件会基于 umi 的路由&#xff0c;封装了更多的配置项&#xff0c;支持更多配置式的能力。新增&#xff1a; 侧边栏菜单配置布局路由级别展示 / 隐藏相关配置与权限插件结合&#xff0c;配置式实现权限路由的功能 示例如下&#xff1a; //config/rou…