第十一届蓝桥杯第二次省赛—E题七段码
题目描述:
小蓝要用七段码数码管来表示一种特殊的文字。 上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a,
b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c
发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c,
d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。 请问,小蓝可以用七段码数码管表达多少种不同的字符?
package 测试;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class 七段码 {
static Map<Character, Character[]> maps;
static Character[] arr = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
public static void main(String[] args) {
//连边连图
//a b c d e f g
//1 2 3 4 5 6 7
maps=new HashMap<>();
Character[] a = {'b', 'f'};
Character[] b = {'a', 'c', 'g'};
Character[] c = {'b', 'g', 'd'};
Character[] d = {'c', 'e'};
Character[] e = {'f', 'd', 'g'};
Character[] f = {'a', 'g', 'e'};
Character[] g = {'b', 'c', 'e', 'f'};
maps.put('a', a);
maps.put('b', b);
maps.put('c', c);
maps.put('d', d);
maps.put('e', e);
maps.put('f', f);
maps.put('g', g);
Set<Set<Character>> sets = dfs(arr, arr.length - 1);
for (Set<Character> set : sets) {
System.out.println(set);
}
System.out.println(sets.size());
}
private static Set<Set<Character>> dfs(Character[] A, int cur) {
Set<Set<Character>> new_set = new HashSet<>();
if (cur == 0) {
for (int i = 0; i < arr.length; i++) {
Set<Character> clone = new HashSet<>();
clone.add(A[i]);
new_set.add(clone);
}
return new_set;
}
Set<Set<Character>> old_set = dfs(A, cur - 1);
for (Set<Character> set : old_set) {
//添加空串
new_set.add(set);
//判断状态
Set<Character> tll =new HashSet<>();
for (Character character : set) {
Character[] characters = maps.get(character);
for (Character character1 : characters) {
if (!set.contains(character1)){
tll.add(character1);
}
}
}
//如果包含的话就可以保存
for (Character character : A) {
if (tll.contains(character)){
//保存set
Set<Character> clone = (Set<Character>) ((HashSet<Character>) set).clone();
//添加非空串
clone.add(character);
new_set.add(clone);
}
}
}
return new_set;
}
}