题目
小蓝要用七段码数码管来表示一种特殊的文字。
七段码上图给出了七段码数码管的一个图示,数码管中一共有 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;
}
}
本文介绍了一种使用七段码数码管表示特殊字符的方法,通过确保发光二极管连成一片来定义合法字符。利用回溯算法找出所有可能的合法组合,并通过排序和去重来确定最终可表示的不同字符数量。
1554

被折叠的 条评论
为什么被折叠?



