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

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

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

像这样的:

求问从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. [C++知识点]2015.4.18

    1.“static_cast/强制转换”后普通函数.虚函数的表现 A基类 B子类 实例aPtr:将B实例强制抓换得到的A实例 实例bPtr:将A实例强制转换得到的B实例 总结: (1) aPtr因为是 ...

  2. Android_Menu_PopupMenu

    layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...

  3. jquery循环遍历radio单选按钮,并设置选中状态

    背景:自己在做项目过程中遇到的问题,现在记录一下. 需求:在ajax获取后台数据的之后,需要根据获取的数据对页面中的radio单选按钮进行选中状态设置 因为自身js功底欠佳,所以耽误了点时间,现在把方 ...

  4. Linux下librdkafka客户端的编译运行

    Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...

  5. Elasticsearch 搜索不到数据问题(_mapping 设置)

    需求 由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???). 为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一 ...

  6. hadoop安装包的目录结构

    初次接触Hadoop,了解了Hadoop安装包的目录结构,和大家分享下: bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理 ...

  7. 并发容器之CopyOnWriteArrayList(转载)

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  8. Navicate DataModel 注册码

    注册信息: 姓    名:ttrar.com 组    织:(空) 序列号:NAVD-6CLM-6BKA-5TXK 内容来自: 可视化数据库设计工具(Navicat Data Modeler)1.0. ...

  9. Spark Shuffle实现

    Apache Spark探秘:Spark Shuffle实现 http://dongxicheng.org/framework-on-yarn/apache-spark-shuffle-details ...

  10. linux字符设备驱动学习笔记(一):简单的字符设备驱动

    最近在鼓捣lnux字符设备驱动,在网上搜集的各种关于linux设备驱动的代码和注释,要么是针对2.4的,要么是错误百出,根本就不能运行成功,真希望大家在发博客的时候能认真核对下代码的正确性,特别是要把 ...