返回题解分享
讨论 / 题解分享/ 帖子详情

七段码(结果填空) - 题解

#### BFS深度优先算法

#include <cstdio>

int g[7][7]={
	{1,1,0,0,0,1,0},
	{1,1,1,0,0,0,1},
	{0,1,1,1,0,0,1},
	{0,0,1,1,1,0,0},
	{0,0,0,1,1,1,1},
	{1,0,0,0,1,1,1},
	{0,1,1,0,1,1,1}
};
bool vis[7];
int dfs(int a){
	int cnt =1;
	for(int i =0;i<7;i++){
		if(!vis[i]&&g[a][i]){
			vis[i]=true;
			cnt+=dfs(i);
			vis[i]=false;
	}
}
return cnt;
}
int main(){
	printf("%d\n",dfs(0)/2);
	return 0;
}


g[7][7]数组代表了七段码数码管中各个二极管之间的连接关系。在这个数组中,1表示两个二极管是相邻的,可以一起发光来表示一个字符;0则表示它们不是相邻的。

具体来说,这个二维数组的每一行和每一列都代表了一个二极管,数组中的每个元素g[i][j]代表了二极管i和二极管j是否相邻。如果g[i][j]1,那么二极管ij是相邻的;如果为0,则不相邻。

例如,g[0][1]1,表示二极管ab是相邻的。而g[0][2]0,表示二极管ac不是相邻的。

逐步分析dfs函数:

  1. int cnt = 1;:这行代码初始化了一个名为cnt的计数器,用于记录从当前二极管开始,连续发光的二极管数量。初始值为1,因为至少当前二极管是发光的。
  2. for(int i = 0; i < 7; i++) { ... }:这个循环遍历所有的二极管,索引从0到6。
  3. if(!vis[i] && g[a][i]) { ... }:这个条件判断两件事:
!vis[i]:检查二极管i是否没有被访问过。如果vis[i]false,表示它还没有被访问。
g[a][i]:检查当前二极管a和二极管i是否相邻。如果g[a][i]1,表示它们是相邻的。
  1. vis[i] = true;:这行代码将二极管i标记为已访问。
  2. cnt += dfs(i);:这行代码递归调用dfs函数,从二极管i开始继续搜索,并将返回的连续发光二极管数量加到cnt上。
  3. vis[i] = false;:这行代码在递归调用返回后,将二极管i的访问状态重置。这样做是为了在后续的搜索中,其他路径也可以访问到这个二极管。

最后结果需要除以2是因为:

在深度优先搜索(DFS)过程中,每个连接的二极管对会被计算两次。这是因为在无向图中,每条边都有两个方向,所以在搜索过程中,每个连接会从两个方向各被探索一次。

例如,如果二极管ab是相连的,那么在DFS搜索中,我们会从ab探索一次,然后从ba再探索一次。这就导致了每个连接被计算了两次。
0 回复 0 转发 0 喜欢 2 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!