蓝桥杯:七段码(java)

本文介绍了一种使用七段码数码管表示特殊字符的方法,通过确保发光二极管连成一片来定义合法字符。利用回溯算法找出所有可能的合法组合,并通过排序和去重来确定最终可表示的不同字符数量。

题目

小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?


解题思路:

使用回溯法,找出全部序列,并判断是否为合法序列。

其中需要将合法序列进行排序,然后用set去重即可。


题目代码:

import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;

public class Main {
	static int count = 0;
	static boolean[] si = new boolean[7];	// 用于标志该数字是否已被使用
	static Set<String> set = new HashSet<String>();	// 用于去重
	
	public static void main(String args[]) {
		int[][] nums = new int[7][];
		char[] temp = new char[7];
		
		Arrays.fill(si, false);
		
		// 初始化
		nums[0] = new int[] {1, 5};			// a
		nums[1] = new int[] {0, 2, 6};		// b
		nums[2] = new int[] {1, 3, 6};		// c
		nums[3] = new int[] {2, 4};			// d
		nums[4] = new int[] {3, 5, 6};		// e
		nums[5] = new int[] {0, 4, 6};		// f
		nums[6] = new int[] {1, 2, 4, 5};	// g
		
		trackbacking(0, temp, nums, si);
		System.out.println(set.size());
	}
	
	static void trackbacking(int len, char[] temp, int[][] nums, boolean[] si) {	// 回溯找出序列
		if(ifis(len, temp, nums)) {	
			char[] ta = new char[len];	// 复制,为了下面的排序,排序为了后面的去重
			for(int i = 0; i < len; i++)
				ta[i] = temp[i];
			Arrays.sort(ta);
			String str = new String(ta);
			set.add(str);
		}
		
		for(int i = 0; i < 7; i++) {
			if(!si[i]) {
				si[i] = true;
				temp[len] = (char)(i+'0');
				trackbacking(len+1, temp, nums, si);
				si[i] = false;	// 回溯
			}
		}
	}
	
	static boolean ifis(int len, char[] temp, int[][] nums) {	// 判断是否合法
		if(len == 0)
			return false;
		for(int i = 1; i < len; i++) {
			boolean sign = false;
			for(int j = 0; j < nums[temp[i-1]-'0'].length; j++) {
				if(nums[temp[i-1]-'0'][j] == temp[i]-'0') {
					sign = true;
					break;
				}
			}
			if(!sign)
				return false;
		}
		return true;
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值