七段码--蓝桥杯

题目

小蓝要用七段码数码管来表示一种特殊的文字。

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

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

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

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

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

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

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

解题:

1.数据(各个二极管的开关情况)存储。因为二极管只有开关两种情况,即用0,1进行二进制存储。二全亮的时为1111111(2进制)即127(十进制),由题至少要有一个二极管发光。因此总情况是

=127

2.由于题中要求在设计字符 的表达时,要求所有发光的二极管是连成一片的。故需要对其中某一发光二极管进行深度优先搜索,并在到达的发光二极管处进行标记,当有二极管发光却未被标记时,这该情况不符题意,由总情况数减一;

3.此时我们便遇到一个问题,如何将连接情况进行存储呢

,以1表示相连,以0表示为相连和相同的数

a

b

c

d

e

f

g

a

0

1

0

0

0

1

0

b

1

0

1

0

0

0

1

c

0

1

0

1

0

0

1

d

0

0

1

0

1

0

0

e

0

0

0

1

0

1

1

f

1

0

0

0

1

0

1

g

0

1

1

0

1

1

0

4.在二进制数中,%2取一位,/2去一位;

代码:

#include<bits/stdc++.h>
using namespace std;
int g[7][7] = {
    {0,1,0,0,0,1,0},
    {1,0,1,0,0,0,1},
    {0,1,0,1,0,0,1},
    {0,0,1,0,1,0,0},
    {0,0,0,1,0,1,1},
    {1,0,0,0,1,0,1},
    {0,1,1,0,1,1,0}
};
int bright[7];
int vis[7];
void dfs(int stick)
{
    for (int i = 0; i < 7; i++)
    {
        if (g[stick][i] && bright[i] && !vis[i])
        {
            vis[i] = 1;
            dfs(i);
        }
    }
    return ;
}
int main()
{
    int i, j, stick, x, ans = 127;
    for (i = 1; i <= 127; i++)
    {
        memset(bright, 0, sizeof(bright));
        memset(vis, 0, sizeof(vis));
        x = i; j = 0;
        while (x)
        {
            if (x % 2)bright[j] = 1;
            x /= 2; j++;
        }
        stick = 0;
        while (!bright[stick])stick++;
        vis[stick] = 1;
        dfs(stick);
        for (j = 0; j < 7; j++)
        {
            if (bright[j] && !vis[j])
            {
                ans--;
                break;
            }
        }
    }
    cout << ans << endl;
    return 0;
}
### 关于蓝桥杯 Java 七段码问题 尽管当前引用材料并未直接提及关于蓝桥杯竞赛中的 **Java 七段码** 的具体解题思路或示例[^1],但可以通过分析以往类似的题目以及常见的算法设计方法来推导可能的解决方案。 #### 题目背景概述 通常情况下,“七段码”指的是用于显示数字的 LED 显示器上的七个线段组合。每一段可以点亮或者熄灭,从而形成不同的字符或数字。这类问题的核心在于如何通过给定条件计算出满足特定要求的结果。 以下是解决此类问题的一般框架: --- ### 解决方案 #### 数据建模 为了表示每一个数字对应的七段码状态,可以用一个长度为7的布尔数组或者整型变量(每一位代表一条线段的状态)。例如: - 数字 `0` 对应 `[true, true, true, false, true, true, true]` - 数字 `8` 对应 `[true, true, true, true, true, true, true]` 这种映射关系可以直接存储在一个二维数组中以便快速访问[^2]。 ```java // 定义七段数码管对应表 (假设索引从高位到低位依次编号A-G) boolean[][] sevenSegmentMap = { {true, true, true, false, true, true, true}, // '0' {false, false, true, false, false, true, false}, // '1' {true, false, true, true, true, false, true}, // '2' {true, false, true, true, false, true, true}, // '3' {false, true, true, true, false, true, false}, // '4' {true, true, false, true, false, true, true}, // '5' {true, true, false, true, true, true, true}, // '6' {true, false, true, false, false, true, false}, // '7' {true, true, true, true, true, true, true}, // '8' {true, true, true, true, false, true, true} // '9' }; ``` #### 输入解析与逻辑判断 对于输入字符串形式的数据序列,需将其转换成相应的七段码位图并逐一比较差异点数量。如果两个相邻位置间存在多条不匹配路径,则需要额外考虑这些变化是否符合最小步数原则。 ```java public int calculateDifference(int digit1, int digit2){ boolean[] segs1 = sevenSegmentMap[digit1]; boolean[] segs2 = sevenSegmentMap[digit2]; int diffCount = 0; for(int i=0;i<segs1.length;i++) { if(segs1[i]!=segs2[i]) diffCount++; } return diffCount; } ``` 上述函数实现了任意两位之间切换所需调整次数的功能[^3]。 #### 动态规划优化 当面对更复杂的场景比如连续多位变换时,可引入动态规划策略降低时间复杂度。定义 dp[i][j] 表达从前i个元素达到目标状态 j 所耗费最少操作数目;转移方程如下所示: dp[i][currentDigit]=min{dp[i−1][prevDigit]+cost(prevDigit,currentDigit)} 其中 cost 函数即前文提到的 calculateDifference 方法实现部分。 最终答案取最后一列所有可能性里的最优值即可得到全局最佳解法。 --- ### 总结 综上所述,在处理涉及七段数码管的相关编程挑战时,关键是构建清晰简洁的内部表达方式,并辅以高效的搜索/迭代机制完成任务需求。以上仅提供了一种通用性的思考角度供参考学习之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值