题目:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 77 段可以发光的二 极管,分别标记为 a,b,c,d,e,f,g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如 c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a,b,c,d,e 发光,f,g 不发光可以用来表达一种字符。
例如:b,f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
运行限制
最大运行时间:1s
最大运行内存: 128M
代码:
import java.util.Scanner;
public class Main { static int count = 0; static int [][] e = new int[10][10]; static int[] f = new int[10]; static boolean[] st = new boolean[10]; public static void main(String[] args) { e[1][2]=e[1][6]=1; e[2][1]=e[2][7]=e[2][3]=1; e[3][2]=e[3][7]=e[3][4]=1; e[4][3]=e[4][5]=1; e[5][7]=e[5][6]=e[5][4]=1; e[6][5]=e[6][7]=e[6][1]=1; e[7][2]=e[7][3]=e[7][5]=e[7][6]=1; dfs(1); System.out.println(count); } public static int find(int i){ if(f[i]==i){ return i; } return f[i] = find(f[i]); } public static void dfs(int d){ if(d > 7 ){ for (int i = 1; i <= 7; i++) { f[i] = i; } for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 7; j++) { if((e[i][j] == 1) && (st[i] ==true) &&(st[j] ==true)){ int fx = find(i); int fy = find(j); if(fx!=fy){ f[fx] = fy; } } } } int k = 0; for (int i = 1; i <= 7 ; i++) { if(st[i] && f[i] == i)k++; } if(k==1)count++; return ; } st[d] = true; dfs(d+1); st[d] = false; dfs(d+1); } }
|
思路:
先将灯管全部打开,然后逐步关闭,遍历所有可能的情况,然后每一种情况我们先设他的父亲为自己,然后如果两边相邻且都亮但父亲不相同,则将其合并此时他们就是同一个父亲(可以理解为是一家人),然后搜索完后进行比较如果所有亮的边属于一家则符合条件情况+1,如果不是一家说明中间有断开的地方则不符合条件跳过。
举个例子:假设a,b,f亮则经过搜索后父亲都为f,则他们是一家人也就是说三边相连符合条件。
如果a,b,f,d亮则abf父亲是f,d的父亲还是自己,则有两家人两家之间不相连不符合条件。