2020年蓝桥杯B组c/c++

该篇博客探讨了如何使用七段码数码管来表示特殊文字,要求发光二极管连成一片。通过递归算法计算所有可能的连通组合,得出可以表达的不同字符数量为80种。程序实现中使用了位运算和集合操作来判断和生成字符表达。

试题E 七段码(T5)

【问题描述】

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

 

七段码上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二极管,分别标记为a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。

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

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

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

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

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

答案:80

#include "stdio.h"
#include <bits/stdc++.h> 
#include<iostream>
#include<set>
using namespace std;
set<int> s;
int arr[7][7]={0};
set<int> s2;

void dfs(int n)
{  
	s.insert(n);
	//cout<<n<<"\t";
	for(int i=0;i<7;i++)
	if(arr[n][i]==1 && s.count(i)==0 &&  s2.count(i)>0)
	dfs(i);
}
int compare(set<int> s1,set<int> s2)
{
	if (s1.size() != s2.size()){
    return 0;
	}
	set<int>::iterator it;
	set<int>::iterator it1;
	//遍历集合中的所有元素 
	for (it = s1.begin(), it1 = s2.begin(); it != s1.end(); it++, it1++){
	    if (*it1 != *it){
	        return 0;
	    }
	}
	 return 1;
}

int ten2bin(int h)
{	//cout<<h<<"\t";
	int j=h;
	s2.clear();
	s.clear();
	int start=0;
	for(int j=7;j>=0;j--)
	{
		if(pow(2,j)<=h)
		{start=j;
		h-=pow(2,j);
		s2.insert(j);
		}
	}
	dfs(start);
	if(compare(s,s2)==1)
	return 1;
	return 0;
}
int main()
{
	arr[0][1]=arr[0][5]=1;
	arr[1][0]=arr[1][2]=arr[1][6]=1;
	arr[2][1]=arr[2][6]=arr[2][3]=1;
	arr[3][2]=arr[3][4]=1;
	arr[4][3]=arr[4][5]=arr[4][6]=1;
	arr[5][0]=arr[5][4]=arr[5][6]=1;
	arr[6][1]=arr[6][2]=arr[6][4]=arr[6][5]=1;
	
	int sum=0;
	for(int i=1;i<=127;i++)
	{
	sum+=ten2bin(i);
   }	
    cout<<sum<<endl;
	return 0;
 } 

### 蓝桥杯省赛C/C++真题及解析 对于蓝桥杯省赛C/C++的相关真题及其解析,网络上确实存在一定的资源稀缺情况。然而,特定份的真题和解答仍然可以找到并提供给参赛者作为练习材料。 #### 2012至2022的真题概览 - **2012第三届至2022第十三届**期间每都有对应的C/C++ B蓝桥杯省赛真题被整理出来[^1]。 这些资料不仅包含了具体的编程挑战问题,还包括了解决这些问题的方法论和技术要点分析。通过研究过往的比赛题目,选手们能够更好地理解考试的形式与难度水平,并针对性地准备自己的技能集。 #### 特定份实例展示 以2020第十一届为例,在该度第二场赛事中有一道关于计算互质数对数量的问题: ```cpp #include <iostream> using namespace std; int gt(int a, int b){ if (a % b == 0) return b; else return gt(b, a % b); } int main(){ int res = 0; for (int i = 2; i <= 2020; i++){ for (int j = 2; j <= 2020; j++){ if (gt(i, j) == 1) res++; } } // 当分子为1时,有2020种,则当分母为1时,去掉一个1/1,还剩2019种, // 最后的既约分数的个数为res + 2020 + 2019; cout << res + 2020 + 2019 << endl; return 0; } ``` 这段代码实现了求解两个正整数之间所有可能形成的最简分数的数量,其中涉及到最大公约数算法的应用[^2]。 另一个例子来自2018的比赛,“第几天”的问题要求确定指定日期是一内具体哪一天: ```c #include<stdio.h> int main(){ int s = 31 + 29 + 31 + 30 + 4; printf("%d", s); return 0; } ``` 这里简单地累加了前几个月的日数再加上目标月份中的日子来得出最终答案125天[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值