七段码
【问题描述】
- 小蓝要用七段码数码管来表示一种特殊的文字。
- 上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。 - 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。 - 例如:b 发光,其他二极管不发光可以用来表达一种字符。
- 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
- 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
- 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。 - 请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
- 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路
- 把a到g看成0到6,通过深度优先搜索(dfs)获取所有子串的情况。
- 再通过广度优先搜索(bfs)判断子串是否相连,相连表示七段码数码管的一种表达形式。
代码
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Main {
static int res = 0;
static int[][] map = new int[][] {
{0,1,0,0,0,1,0},
{1,0,1,0,0,0,1},
{0,1,0,1,0,0,1},
{0,0,1,0,1,0,0},
{0,0,0,1,0,1,1},
{1,0,0,0,1,0,1},
{0,1,1,0,1,1,0}
};
public static void main(String[] args) {
List<Integer> path = new ArrayList<>();
dfs(path, 0);
System.out.println(res);
}
private static void dfs(List<Integer> path, int k) {
if (k == 7) {
if (bfsCheck(path)) {
res++;
}
return;
}
path.add(k);
dfs(path, k+1);
path.remove(path.size()-1);
dfs(path, k+1);
}
private static boolean bfsCheck(List<Integer> path) {
if (path.size() == 0) {
return false;
}
if (path.size() == 1) {
return true;
}
int count = 0;
Queue<Integer> queue =new LinkedList<Integer>();
int[] visited = new int[7];
visited[path.get(0)] = 1;
queue.add(path.get(0));
while (!queue.isEmpty()) {
int vlaue = queue.poll();
count++;
for (int i = 0; i < map[vlaue].length; i++) {
if (map[vlaue][i] == 1 && visited[i] == 0 && path.contains(i)) {
queue.add(i);
visited[i] = 1;
}
}
}
return path.size() == count;
}
}
答案:80