七段码(BFS与二进制枚举)
七段码

思路
二进制枚举
- 首先 7段数码管:亮/不亮,一共只有\(2^7\)种可能
- 枚举\(x∈[1,2^7]\),对x进行拆位
- 例如:0101001——选择2,4,7这几段数码管
- BFS检查(这几段数码管的)连通性
int e[N][N],isIn[N],book[N],maxi,sx,len,ans;//e图,isIn[i]=1选中i,book防止重复遍历
void bfs()//连通性判断
{
if(len==0) return ;
queue<int> q;
int cnt=0;
q.push(sx);
book[sx]=1;
cnt++;
while(!q.empty()){
int head=q.front(); q.pop();
for(int i=1;i<=7;++i){
if(i==head||isIn[i]==0||book[i]==1) continue;
if(e[head][i]==1){
q.push(i);
book[i]=1;
cnt++;
}
}
}
if(cnt==len) ans++;//如果所有数码管都入过队,连通,ans++
return ;
}
int main()
{
for(int i=1;i<=7;++i){//初始化
for(int j=1;j<=7;++j){
e[i][j]=-1;
}
}
e[1][2]=e[2][1]=1;
e[1][6]=e[6][1]=1;
e[2][3]=e[3][2]=1;
e[2][7]=e[7][2]=1;
e[3][4]=e[4][3]=1;
e[3][7]=e[7][3]=1;
e[4][5]=e[5][4]=1;
e[5][6]=e[6][5]=1;
e[5][7]=e[7][5]=1;
e[6][7]=e[7][6]=1;
maxi=(1<<7);
for(int i=1;i<maxi;++i){//枚举1-2^7(不含0)
for(int j=6,k=1;j>=0;--j,++k){//拆位
if(((i>>j)&1)==1){
isIn[k]=1;//标记:选编号为k的数码管
len++;//选的数码管数量++
if(len==1) sx=k;//sx作为bfs起点
}
}
bfs();
len=0;//清空
memset(isIn,0,sizeof(isIn));
memset(book,0,sizeof(book));
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号