蓝桥杯 七段码 C++
#include<iostream>
using namespace std;
int use[10];//判定每一段二极管是否使用了
int ans=0;
int e[10][10];//二极管是够相连
int father[10];
int find(int x)//并查集
{
int r=x;
while(r!=father[r])
r=father[r];
return father[r];
}
void dfs(int d)
{
if(d>7)
{
for(int i=1;i<=7;i++)
{
father[i]=i;
}
for(int i=1;i<=7;i++)
{
for(int j=1;j<=7;j++)
{
if(use[i]&&use[j]&&e[i][j])
{
int x=find(i),y=find(j);
if(x!=y)
{
father[y]=x;
}
}
}
}
int k=0;
for(int i=1;i<=7;i++)
{
if(use[i]&&father[i]==i)
k++;
}
if(k==1)//表明被选中的二极管是连通的
ans++;
return;
}
use[d]=1;
dfs(d+1);
use[d]=0;
dfs(d+1);
}
int main()
{
//边初始化
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;
dfs(1);
cout<<ans;
}
运行截图