#include<iostream>
using namespace std;
int pip[7][7];//用来表示是否连通
int fa[7],vis[7],ans;//父节点和亮不亮
int getfa(int i)
{
if(fa[i]==i)
return i;
else
return fa[i]=getfa(fa[fa[i]]);//查询的时候顺便压缩
}
void dfs(int k)//主要以每段亮不亮为递归分支或者7重循环
{//感觉非常像最小生成树的克鲁斯卡尔算法
//k=6的时候整颗分支树情况以及遍历完了
if(k==6)//每段灯管都抉择了亮不亮完即树走完7层了才统计才对
{//而不是在半路就统计
for(int i=0;i<7;i++)
fa[i]=i;//根先初始化设置自己
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(pip[i][j]==1&&vis[i]==1&&vis[j]==1)
{//两段链接且都亮就并查集合并父亲
if(getfa(i)!=getfa(j))
{//记得一定要要置另一段路的根节点合并过去
fa[getfa(i)]=j;//或者fa[getfa(i)]=getfa(j);也可以就是最终并入的地方不一样
}
}
}
}
int count=0;//计算亮且连通的通道个数
for(int i=0;i<7;i++)
if(fa[i]==i&&vis[i]==1)//以根节点为计量即可
count++;
if(count==1)//根据题意只有一段的时候才符合
ans++;
return ;//遍历完一种情况了不要再继续点灯了
}
if(k+1<=6)
{
//亮和不亮的接着分支枚举
vis[k+1]=1;
dfs(k+1);
vis[k+1]=0;
dfs(k+1);
}
}
int main(void)
{
pip[0][1]=pip[0][5]=1;
pip[1][0]=pip[1][2]=pip[1][6]=1;
pip[2][1]=pip[2][3]=pip[2][6]=1;
pip[3][2]=pip[3][4]=1;
pip[4][3]=pip[4][5]=pip[4][6]=1;
pip[5][4]=pip[5][0]=pip[5][6]=1;
pip[6][5]=pip[6][4]=1;pip[6][1]=pip[6][2]=1;
vis[0]=0;
dfs(0);
vis[0]=1;
dfs(0);
cout<<ans;
return 0;
}
蓝桥杯七段码
最新推荐文章于 2025-03-31 13:46:09 发布