#### BFS深度优先算法
具体来说,这个二维数组的每一行和每一列都代表了一个二极管,数组中的每个元素
逐步分析dfs函数:
最后结果需要除以2是因为:
例如,如果二极管
#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,那么二极管i和j是相邻的;如果为0,则不相邻。例如,g[0][1]是1,表示二极管a和b是相邻的。而g[0][2]是0,表示二极管a和c不是相邻的。
逐步分析dfs函数:
int cnt = 1;:这行代码初始化了一个名为cnt的计数器,用于记录从当前二极管开始,连续发光的二极管数量。初始值为1,因为至少当前二极管是发光的。for(int i = 0; i < 7; i++) { ... }:这个循环遍历所有的二极管,索引从0到6。if(!vis[i] && g[a][i]) { ... }:这个条件判断两件事:
!vis[i]:检查二极管i是否没有被访问过。如果vis[i]为false,表示它还没有被访问。g[a][i]:检查当前二极管a和二极管i是否相邻。如果g[a][i]为1,表示它们是相邻的。vis[i] = true;:这行代码将二极管i标记为已访问。cnt += dfs(i);:这行代码递归调用dfs函数,从二极管i开始继续搜索,并将返回的连续发光二极管数量加到cnt上。vis[i] = false;:这行代码在递归调用返回后,将二极管i的访问状态重置。这样做是为了在后续的搜索中,其他路径也可以访问到这个二极管。
最后结果需要除以2是因为:
在深度优先搜索(DFS)过程中,每个连接的二极管对会被计算两次。这是因为在无向图中,每条边都有两个方向,所以在搜索过程中,每个连接会从两个方向各被探索一次。
例如,如果二极管
a和b是相连的,那么在DFS搜索中,我们会从a到b探索一次,然后从b到a再探索一次。这就导致了每个连接被计算了两次。
0 回复
0 转发
0 喜欢
2 阅读



