七段码
作者:
husheng
,
2022-05-22 20:16:42
,
所有人可见
,
阅读 215
实现思路:DFS+并查集
对于每一根二极管都可以选或者不选,用递归来枚举发光二极管的所有情况.
在递归结束的位置用并查集去判断所选择的二极管是不是连通的(在同一个集合中)
public class Main {
static int[][] arr=new int[10][10];
static boolean[] use=new boolean[10];
static int[] p=new int[10];
static int ans=0;
public static void init() {
arr[1][2]=arr[1][6]=1;
arr[2][7]=arr[2][3]=1;
arr[3][4]=arr[3][7]=1;
arr[4][5]=1;
arr[6][7]=1;
arr[5][6]=arr[5][7]=1;
}
public static int find(int x) {
if(p[x]!=x) {
p[x]=find(p[x]);
}
return p[x];
}
public static void dfs(int cur) {
if(cur==7) {
for(int i=1;i<=7;i++) {
p[i]=i;
}
for(int i=1;i<=7;i++) {
for(int j=i+1;j<=7;j++) {
if(arr[i][j]==1&&use[i]&&use[j]) {
p[find(i)]=find(j);
}
}
}
int cnt=0;
for(int i=1;i<=7;i++) {
if(use[i]&&find(i)==i) {
cnt++;
}
}
if(cnt==1) ans++;
return ;
}
use[cur+1]=true;
dfs(cur+1);
use[cur+1]=false;
dfs(cur+1);
}
public static void main(String[] args) {
init();
dfs(0);
System.out.println(ans);
}
}