解析:
dfs+并查集
不知道并查集的话可以看这个博客
import java.util.Scanner;
public class Main
{
static int[]open=new int[10];
static int[]f=new int[10];
static int[][]e=new int[10][10];
static int ans=0;
public static void init()//给图建边
{
e[1][2]=e[1][6]=1;
e[2][1]=e[2][7]=e[2][3]=1;
e[3][2]=e[3][4]=e[3][7]=1;
e[4][3]=e[4][5]=1;
e[5][4]=e[5][6]=e[5][7]=1;
e[6][1]=e[6][5]=e[6][7]=1;
}
public static int getFather(int x)//找代表人
{
return x==f[x]?x:getFather(f[x]);//如果x==f[x]则返回x本身,否则返回f[x]的代表人,递归到最终代表人为止。
}
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(open[i]!=0&&open[j]!=0&&e[i][j]==1)//如果是相邻边并且都亮的话
{
if(getFather(i)!=getFather(j))//代表人不相等,则让他们合并
f[getFather(i)]=getFather(j);
}
}
}
int k=0;
for(int i=1;i<=7;i++)//循环,判断是否亮的相连
{
if(open[i]!=0&&f[i]==i)
k++;
}
if(k==1) ans++;
return;
}
open[d]=1;//打开这个灯,继续开下一个灯
dfs(d+1);
open[d]=0;//关闭这个灯,继续开下一个灯
dfs(d+1);
}
public static void main(String[] args) {
init();
dfs(1);
System.out.println(ans);
}
}