n段码

2024-01-20 18:08
文章标签 段码

本文主要是介绍n段码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
n段码 【问题描述】 小K要用n段数码管来表示一种特殊的符号(n取1,2,3,4,5,6,7),n段数码管就对应着有n个发光二极管。

上图给出了n段码数码管的一个图示,数码管中一共有n 段可以发光的二极管

以7段码为例,上图二极管分别标记为0,1,2,3,4,5,6。小K要选择一部分二极管(至少要有一个)发光来表达符号。在设计字符的表达时,要求所有发光的二极管是连成一片的,发光记为1,不发光记为0. 例如:1 发光,其他二极管不发光可以用来表达一种符号(0 1 0 0 0 0 0)。 例如:2 发光,其他二极管不发光可以用来表达一种符号(0 0 1 0 0 0 0)。 例如:0, 1, 2, 3, 4发光,5, 6 不发光可以用来表达一种符号(1 1 1 1 1 0 0)。

例如:1,5发光,其他二极管不发光则不能用来表达一种符号,因为发光的二极管没有连成一片。 请问,小K可以用n段码数码管表达哪些不同的符号?

(1<=n<=7)

输入格式:
第一行输入一个正整数n表示n段码数码管。

输出格式:
输出n段码数码管所能表达出哪些不同的符号。

输出为从小到大输出,每行的输出不能有多余空格.

观察题目,类似2020年的蓝桥的七段码,相较之下,这题更难一些。
思路:
对于每一个输入n,我们应该要构建相应的每一段灯管之间的关系图,而这题的数据并不大,所以用简单易懂的邻接矩阵

int m[7][7] = {{1,1,0,0,0,1,0},{1,1,1,0,0,0,1},{0,1,1,1,0,0,1},{0,0,1,1,1,0,0},{0,0,0,1,1,1,1},{1,0,0,0,1,1,1},{0,1,1,0,1,1,1}
};

上表我相信大家是可以看得懂的,1表示i-j之间有边连接,0表示i-j之间没有连接,至于自身到自身,1也可以,0也可以,因为代码的逻辑不会让我们同时遍历一个点两次。
建完了图,有了一个n那么继续看题目的要求,从小到大输出,也就是我们可以从1开始(0不亮没必要判断)一直到(1 << n )-1,就可以把全部的情况遍历过去,并且是按顺序的输出。这个数字的二进制表示就代表,该位上亮灯或者不亮灯。
比如数字6

二进制110
下标210

当然,这样的顺序有点奇怪,我们可以在代码中作以修改。
接下来,开始重点,如何判断这次枚举的状态可行还是不可行。首先我们不断对这次枚举的i右移,不断提取出当前这个位置上的数字,而后用n减去cnt(提取的次数- 1),就得到了实际上的下标。(这里的减一或者不减,只需要自己拿一个例子算一下就可以得除了)
然后我们把所有亮灯的灯管,insert进一个set,然后以每一个点为起点做bfs,如果有一个点可以遍历完所有亮灯的灯管的话,也就是说明,亮着的灯是连成一块的。那么就可行,如果没有一个点作为起点可以遍历完全部亮灯的灯管的话,就说明不行。
然后调整一下输出格式就可以拉。

代码如下:


#include<iostream>
#include<stack>
#include<set>
#include<queue>
#include<cstring>
using namespace std;
int n;
int m[7][7] = {{1,1,0,0,0,1,0},{1,1,1,0,0,0,1},{0,1,1,1,0,0,1},{0,0,1,1,1,0,0},{0,0,0,1,1,1,1},{1,0,0,0,1,1,1},{0,1,1,0,1,1,1}
};
int ans = 0;
set<int>s;
int vis[7];
bool bfs(int t)
{queue<int>q;memset(vis, 0, sizeof vis);q.push(t);vis[t] = 1;while (q.size()){int x = q.front();q.pop();for (int i = 0; i < n; ++i){if (i == x)continue;if (s.find(i)!=s.end()&&m[x][i] && !vis[i]){q.push(i); vis[i] = 1;}}}for (auto& x : s){if (!vis[x])return false;}return true;
}
bool check(int t)
{s.clear();int cnt = 0,f = 0;for (int i = t; i; i >>= 1,cnt++){if (i & 1)s.insert(n-cnt-1);}for (auto& x : s){if (bfs(x)) {f = 1; break;}}return f;
}
void print(int t)
{int cnt = 0;stack<int>st;for (; cnt < n; t >>= 1,cnt++){st.push(t & 1);}while (st.size()){printf("%d", st.top()); st.pop();if(st.size())putchar(' ');}puts("");
}
int main() {cin >> n;for (int i = 1; i < (1 << n); ++i){if (check(i)){print(i);ans++;}}//cout << ans;return 0;
}

这篇关于n段码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626858

相关文章

超低功耗LCD显示段码驱动芯片VKL128 LQFP44 适用于扫地机器人/燃气表-原厂技术支持

VKL128是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。L23+01 特点: • 工作电压 2.4-5.5V • 内置32 kHz RC振荡器 • 偏置电压(BIAS)

TM1622 程序调试过程中出现个别RAM段码显示异常,缺段(段比较暗),影响其他的段也比较暗显示问题

TM1622 程序调试过程中出现个别RAM段码显示异常,缺段(段比较暗),影响TM1622其他ROM未写入数据的段也有比较暗的显示。 这个问题现在想来应该比较好笑,只是当时调试的时候一时没有缓过来,记录下来用以提醒一下自己。 在出现这个问题时,第1反应,可能是我的1622配置没有设置好,对照TM1622的数据手册,增加了NORMAL命令,命令格式如下: 这个命令1622上电复位后是缺省默认的,可以

VA段码屏的颜色丝印有要求吗?

今天帮客户设计一款VA的液晶屏图纸,基本是满屏的彩色丝印,一共三个颜色,红色、黄色、绿色,丝印面积太大的话会导致偏光片的附着力降低,偏光片是靠打胶粘在玻璃上的,这个色块是在玻璃和偏光片之间,这样就导致了偏光片和玻璃之间的胶少了,偏光片容易脱落,正常丝印面积不能超过可视区域面积的一半,除了这个另外还有一点也很重要,就是超过两百模的小尺寸玻璃,是做不了丝印的,包括边框的黑色丝印也不能做,因为玻璃尺寸小

段码液晶屏应用于锂电池

锂电池的应用使得一些电动用品充电简单,携带方便,因此很快的广泛使用,比方电动剃须刀、电动扳手、移动电源等。今天给大家分享,段码液晶屏应用在电动扳手的锂电池包。 电动扳手或者锂电钻这几年在国内的应用发展迅速,因为省时省力,而且越来越多的厂家推出性价比高的产品出来,渐渐被国人接受。这类电动工具也是一个电子产品,之前的文章也提到过,既然是一个电子产品,那么就有简单的人机对话的操作环境,也就是通过显示来

LCD段码屏开发需要确认的内容,你清楚了吗?

详细的一份LCD段码屏的设计图应当包括四个一部分:尺寸参数表、逻辑表、走线图、设计效果图。 尺寸参数表包括的参数:外型尺寸,可视性区域尺寸,针角尺寸和间隔,厚度,材料,工作电压,正负极显,全透、半透或反射,com数和偏压比,操作温度与存储溫度,角度,显示內容。这些内容在LCD段码屏里是不可出错的。 真值表:这个是用于写程序的情况下应用的编码,取得工程图纸后一定要好好地核对,看一下笔段是否有

段码LCD液晶屏进湿气了怎么办?

春季空气湿度大,液晶屏需要防潮,尤其是在定制过程中,两片玻璃之间进去了湿气,那么在灌晶的时候就会出现大量的气泡,这样就会造成大批量的不良品,也是劳民伤财,突出表现在样品加做的时候,正常没灌晶的空盒可以保存3个月左右,空盒再春季可能只有1–2个月的保质期,湿气大很容易进入液晶屏里面,恒温恒湿的环境不是很好控制 还有一种情况,液晶屏的使用环境是湿度非常大的,比如浴室里面使用的浴霸开关控制器,液晶屏要

段码屏能不能做拼接方案?

今天一个老客户来公司拜访,说之前做的VA屏感觉尺寸有点小了看起来不够大气,想要做大一点的,大概6寸左右,但是价格算下来又超出他们的预算了,再加上液晶屏本身的显示内容比较少,客户就想能不能由四块小的液晶屏拼接起来,这个办法听起来是可行的,但是有一个弊端就是背光容易漏光,并且开模的话要开四套模具了,成本上也不低,客户说对于漏光的话可以用一个黑色的外框给遮住,实际上四个屏,还有两边的针脚,想要无缝对接是