广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一。搜索方式大致是这样的:

直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索。

实现这个要是想用像深度优先算法那样函数套函数那样是难以实现的(至少我实现不了)。

像这样的:

求问从A到B的最短路径的结点数是多少?

这道题很简单嘛,肯定是A-C-B啊,答案是3啊。那怎样用C语言实现呢?

深搜的话:一条路一条路读取,取结点数最小的,也可以,但是问题来了,当结点数特别多,图非常“辽阔”时,怎么办呢?

用广搜啦!

这里设A的标志为0(这样好些代码嘛),其他的以此类推,所以路径A-C-B就是0-2-1啦

根据路是不是相同的,我们可以创建一个布尔型二维数组way,way[w1][w2]=1代表从w1可以到达w2,=0时则代表不能,注意,因为我们是不会走回头路的,所以所有路都是单向的,比如c->b是可以的,但b->c是不可以的

_Bool way[6][6]={
{0,0,1,1,1,0},
{0,0,0,0,0,0},
{0,1,0,0,0,0},
{0,0,0,0,0,1},
{0,0,0,0,0,1},
{0,1,0,0,0,0},
};

创建一个step数组,初始值为0,step[0]代表A的结点数,step[1]代表B的结点数,因为A只有一个结点所以step[0]=1,储存列出了几层子结点,也就是目前所有路径的结点数

创建一个队列,比如叫que(其实就是个数组嘛)

简单讲下队列的概念:有队首(head)和队尾(tail)两个指针,分别指着队列的第一个元素与最后一个元素。队列只允许从队尾加入队伍,从队首退出队伍。

此时head=tail=0:

在队列que中加入A结点的标志0,步骤是将tail+=1并且que[tail]=0(如图所示)

然后搜索A的子结点,例如这样:

循环(i=0;i<=5;i++)//因为共有6个结点

如果(way[que[head+1]][i]==1)把子结点加入队列;

加入队列的方法就是:

tail+=1;

que[tail]=子结点标志;

注意要让子结点的结点数+=它的父结点的结点数

最后效果如图

当循环完毕以后呢,就等于把A的子结点全找出来了,列出了一整层结点,删去第一个结点,step[2]和[3]和[4]都=step[0]+1,head-=1,那样head指的就是A的子结点C(标志2)了如图

继续判断,搜索2的子结点,并且加入队列,再删去2,搜索3的子结点……直到最后tail指针指的是B(标志1),则输出step[1](B的标志是1),就是最短路径数。如果head=tail了,说明队列为空,而且没找到答案,所以就没有可以到达目标结点的路,输出什么的就随你了。

附上此题答案:

#include <stdio.h>
#include <string.h>
_Bool way[][]={
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
}; int main()
{
int que[],head=,tail=,i,step[];
memset(step,,sizeof(step));//初始化步数数组
que[]=;//初始化队首
step[]=; //结点A的步数为1
do
{
for(i=;i<=;i++)
{
if(way[que[head+]][i]==)
{
tail++;
que[tail]=i;
step[i]=step[que[head+]]+;
if(que[tail]==)
{
printf("%d",step[]);
return ;
}
}
}
head++;
}while(head<tail);//当队列不为空
printf("no answer!");
return ;
}

C语言之广度优先算法的更多相关文章

  1. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  2. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  3. 指定url和深度的广度优先算法爬虫的python实现

    本文参考http://zoulc001.iteye.com/blog/1186996 广度优先算法介绍 整个的广度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的"子节点"( ...

  4. golang 实现广度优先算法(走迷宫)

    maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...

  5. C# 遍历文件夹非递归实现(采用队列的广度优先算法)(转)

    一.实现思路: 1. 创建一个队列(使用C# 队列类 Queue,需要使用命名空间 System.Collections.Generic): 2. 把起始文件夹名称排入队中: 3. 检查队列中是否有文 ...

  6. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  7. 0.数据结构(python语言) 基本概念 算法的代价及度量!!!

    先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...

  8. C语言版数据结构算法

    C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...

  9. C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

随机推荐

  1. 实例源码--Android高德地图实例源码

      下载源码 技术要点: 1.高德地图 API的使用 2.定位 ,查询路线,公交查询等地图相关技术 3.源码带有非常详 细的中文注释 ...... 详细介绍:  1. 高德地图API的使用 本套实例采 ...

  2. How to setup SLF4J and LOGBack in a web app - fast--转载

    原文:https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast Logback is ...

  3. Android Studio配置Dagger2 以及butterknife

    一.配置butterknife 在build.gradle(Module)文件中的dependencies模块添加: dependencies { // add butterknife compile ...

  4. C++ (P199—P211)多态 虚函数 抽象类

    在介绍多态之前,先回忆:赋值兼容原则.虚基类.二义性.派生类如何给基类赋值等知识. 在赋值兼容原则中:父类对象的指针赋给基类的指针或者父类的对象赋给基类的引用,可以通过强转基类的指针或者引用变为父类的 ...

  5. Android之获取联系人

    Android入门中,记录学习中的遇到的问题和一些个人总结. 联系人数据库路径为:/data/data/com.android.providers.contacts/database/contacts ...

  6. 兼容IE6/IE7/IE8/FireFox的css hack

    兼容IE6/IE7/IE8/FireFox的css hack .color{ background-color: #CC00FF; background-color: #FF00009; *backg ...

  7. 【转】myeclipse 上安装 Maven3

    [转]myeclipse 上安装 Maven3 环境准备: JDK 1.6 Maven 3.0.4 myeclipse 8.6.1 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Ma ...

  8. SimpleDateFormat 的性能和线程安全性

    系统正常运行一段时间后,QA报给我一个异常: java.lang.OutOfMemoryError: GC overhead limit exceeded at java.text.DecimalFo ...

  9. 利用Ajax改变发送请求方式

    由于测试的时候需要模拟Head请求,解决办法:先访问要请求的站点,然后在浏览器的控制台下执行如下代码,请求方式就为参数给的值: var xmlHttp; if (window.ActiveXObjec ...

  10. 常用AWK命令

    常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...