2020年第十一届Java B组蓝桥杯省赛真题 第五题:七段码

该博客主要探讨了如何利用七段码数码管表示不同的字符,并通过递归和广度优先搜索(BFS)判断字符表示的连通性。作者首先初始化了一个映射,将每个段码对应可能发光的二极管组合存储在列表中,然后通过递归生成所有可能的字符表示,并用BFS检查这些表示是否为连通区域。最终输出可以表示的不同字符数量。
摘要由CSDN通过智能技术生成

七段码

转载链接:https://blog.csdn.net/VanGotoBilibili/article/details/115575994

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

图片描述

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

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

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

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

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

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

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

最大运行时间:1s
最大运行内存: 128M

题目分析:

  • 如何求字符串的所有子集----------------递归
  • 如何判断连通区域--------------------------bfs

题目代码:

public class Main{
	static int counts=0;
	static Set<String>set=new HashSet<>();
	static Map<String,ArrayList<String>>map=new HashMap<>();
	public static void main(String[] args) {
		String str="abcdefg";
		//初始化
		ArrayList<String>list1=new ArrayList<>();
		ArrayList<String>list2=new ArrayList<>();
		ArrayList<String>list3=new ArrayList<>();
		ArrayList<String>list4=new ArrayList<>();
		ArrayList<String>list5=new ArrayList<>();
		ArrayList<String>list6=new ArrayList<>();
		ArrayList<String>list7=new ArrayList<>();
		list1.add("b");list1.add("f");
		list2.add("a");list2.add("g");list2.add("c");
		list3.add("b");list3.add("g");list3.add("d");
		list4.add("c");list4.add("e");
		list5.add("f");list5.add("g");list5.add("d");
		list6.add("a");list6.add("g");list6.add("e");
		list7.add("f");list7.add("e");list7.add("b");list7.add("c");
		map.put("a", list1);
		map.put("b", list2);
		map.put("c", list3);
		map.put("d", list4);
		map.put("e", list5);
		map.put("f", list6);
		map.put("g", list7);
		
		//求字符串的所有字串
		find("",str,0);

		System.out.println(counts);
	}
	static void find(String temp,String str,int index) {
		if(index==str.length()) {
			//最后对得到的字串检查是否是一个连通区域
			if(bfsCheck(temp.toCharArray()))counts++;
			return;
		}
		find(temp,str,index+1);
		find(temp+=str.charAt(index),str,index+1);
	}
	static boolean bfsCheck(char[] strs) {
		//先对简单情形直接判断
		if(strs.length==0)return false;
		if(strs.length==1)return true;
		if(strs.length==2) {
			if(map.get(strs[0]+"").contains(strs[1]+""))return true;
			else return false;
		}
		LinkedList<String> queue=new LinkedList<>();
		int connect=1;
		queue.add(strs[0]+"");
		strs[0]='0';
		while(!queue.isEmpty()) {
			String str  = queue.poll();
			ArrayList<String> list = map.get(str);
			for(int i=0;i<strs.length;i++) {
				if(list!=null&&list.contains(strs[i]+"")) {
					connect++;
					queue.add(strs[i]+"");
					strs[i]='0';
				}
			}
		}
		if(connect==strs.length)return true;
		return false;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值