头像

欢迎来到我的博客

分享题解与总结

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

七段码

屏幕截图 2026-03-28 220115

思路

二进制枚举

  1. 首先 7段数码管:亮/不亮,一共只有\(2^7\)种可能
  2. 枚举\(x∈[1,2^7]\),对x进行拆位
  3. 例如:0101001——选择2,4,7这几段数码管
  4. 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;
}
posted @ 2026-03-28 22:11  king_steph1209  阅读(26)  评论(0)    收藏  举报