图的广度优先搜索的应用

合集下载

信息学竞赛中的广度优先搜索算法

信息学竞赛中的广度优先搜索算法

信息学竞赛中的广度优先搜索算法广度优先搜索(Breadth-First Search,BFS)是一种常用的图搜索算法,广泛应用于信息学竞赛中。

本文将介绍广度优先搜索算法的原理、应用场景以及实现方法。

一、算法原理广度优先搜索算法是一种基于队列的搜索算法,通过逐层扩展搜索的方式,从起始节点开始,依次遍历其邻接节点,然后依次遍历邻接节点的邻接节点,直到找到目标节点或遍历完所有节点为止。

该算法的基本过程如下:1. 创建一个队列,并将起始节点加入队列;2. 从队列中取出首个节点,并标记为已访问;3. 遍历该节点的邻接节点,若未被标记为已访问,则将其加入队列;4. 重复步骤2和步骤3,直到队列为空或找到目标节点。

广度优先搜索算法可以用来解决一些与图相关的问题,比如最短路径问题、连通性问题等。

二、应用场景广度优先搜索算法在信息学竞赛中有广泛的应用,以下是一些常见的应用场景。

1. 连通性问题:判断图中两个节点是否连通。

通过广度优先搜索,可以从起始节点开始遍历图,找到目标节点即可判断其连通性。

2. 最短路径问题:找到两个节点之间的最短路径。

广度优先搜索每一层的遍历都是从起始节点到目标节点的可能最短路径,因此可以通过记录路径长度和路径信息,找到最短路径。

3. 迷宫问题:求解迷宫中的最短路径。

迷宫可以看作是一个图,起始位置为起始节点,终点位置为目标节点,通过广度优先搜索可以找到迷宫中的最短路径。

4. 可达性问题:判断一个节点是否可达其他节点。

通过广度优先搜索,可以从起始节点开始遍历图,标记所有可达节点,然后判断目标节点是否被标记。

三、实现方法广度优先搜索算法的实现可以使用队列来辅助完成。

以下是一个基于队列的广度优先搜索算法的伪代码示例:```BFS(start, target):queue = [start] // 创建一个队列,并将起始节点加入队列visited = set() // 创建一个集合,用于标记已访问的节点while queue is not emptynode = queue.pop(0) // 从队列中取出首个节点visited.add(node) // 标记节点为已访问if node == targetreturn True // 找到目标节点,搜索结束for neighbor in node.neighbors // 遍历节点的邻接节点if neighbor not in visitedqueue.append(neighbor) // 将邻接节点加入队列return False // 队列为空,未找到目标节点```四、总结广度优先搜索算法在信息学竞赛中是一种常用的算法,它通过逐层遍历的方式,能够快速的找到目标节点或解决与图相关的问题。

广度优先搜索的原理及应用是什么

广度优先搜索的原理及应用是什么

广度优先搜索的原理及应用是什么1. 原理广度优先搜索(Breadth-First Search, BFS)是一种图的遍历算法,它从图的起始顶点开始,逐层地向外探索,直到找到目标顶点或者遍历完整个图。

通过利用队列的数据结构,广度优先搜索保证了顶点的访问顺序是按照其距离起始顶点的距离递增的。

广度优先搜索的基本原理如下:1.选择一个起始顶点,将其加入一个待访问的队列(可以使用数组或链表实现)。

2.将起始顶点标记为已访问。

3.从队列中取出一个顶点,访问该顶点,并将其未访问过的邻居顶点加入队列。

4.标记访问过的邻居顶点为已访问。

5.重复步骤3和步骤4,直到队列为空。

广度优先搜索保证了先访问距离起始点近的顶点,然后才访问距离起始点远的顶点,因此可以用来解决一些问题,例如最短路径问题、连通性问题等。

2. 应用广度优先搜索在计算机科学和图论中有着广泛的应用,下面是一些常见的应用场景:2.1 最短路径问题广度优先搜索可以用来找出两个顶点之间的最短路径。

在无权图中,每条边的权值都为1,那么从起始顶点到目标顶点的最短路径就是通过广度优先搜索找到的路径。

2.2 连通性问题广度优先搜索可以用来判断两个顶点之间是否存在路径。

通过从起始顶点开始进行广度优先搜索,如果能够找到目标顶点,就说明两个顶点是连通的;如果搜索完成后仍然未找到目标顶点,那么两个顶点之间就是不连通的。

2.3 图的遍历广度优先搜索可以用来遍历整个图的顶点。

通过从起始顶点开始进行广度优先搜索,并在访问每个顶点时记录下访问的顺序,就可以完成对整个图的遍历。

2.4 社交网络分析广度优先搜索可以用来分析社交网络中的关系。

例如,在一个社交网络中,可以以某个人为起始节点,通过广度优先搜索找出与该人直接或间接连接的人,从而分析人际关系的密切程度、社区结构等。

2.5 网络爬虫广度优先搜索可以用来实现网络爬虫对网页的抓取。

通过从初始网页开始,一层层地向外发现新的链接,并将新的链接加入待抓取的队列中,从而实现对整个网站的全面抓取。

深度优先算法和广度优先算法的时间复杂度

深度优先算法和广度优先算法的时间复杂度

深度优先算法和广度优先算法的时间复杂度深度优先算法和广度优先算法是在图论中常见的两种搜索算法,它们在解决各种问题时都有很重要的作用。

本文将以深入浅出的方式从时间复杂度的角度对这两种算法进行全面评估,并探讨它们在实际应用中的优劣势。

1. 深度优先算法的时间复杂度深度优先算法是一种用于遍历或搜索树或图的算法。

它从图中的某个顶点出发,沿着一条路径一直走到底,直到不能再前进为止,然后回溯到上一个节点,尝试走其他的路径,直到所有路径都被走过为止。

深度优先算法的时间复杂度与图的深度有关。

在最坏情况下,深度优先算法的时间复杂度为O(V+E),其中V表示顶点的数量,E表示边的数量。

2. 广度优先算法的时间复杂度广度优先算法也是一种用于遍历或搜索树或图的算法。

与深度优先算法不同的是,广度优先算法是从图的某个顶点出发,首先访问这个顶点的所有邻接节点,然后再依次访问这些节点的邻接节点,依次类推。

广度优先算法的时间复杂度与图中边的数量有关。

在最坏情况下,广度优先算法的时间复杂度为O(V+E)。

3. 深度优先算法与广度优先算法的比较从时间复杂度的角度来看,深度优先算法和广度优先算法在最坏情况下都是O(V+E),并没有明显的差异。

但从实际运行情况来看,深度优先算法和广度优先算法的性能差异是显而易见的。

在一般情况下,广度优先算法要比深度优先算法快,因为广度优先算法的搜索速度更快,且能够更快地找到最短路径。

4. 个人观点和理解在实际应用中,选择深度优先算法还是广度优先算法取决于具体的问题。

如果要找到两个节点之间的最短路径,那么广度优先算法是更好的选择;而如果要搜索整个图,那么深度优先算法可能是更好的选择。

要根据具体的问题来选择合适的算法。

5. 总结和回顾本文从时间复杂度的角度对深度优先算法和广度优先算法进行了全面评估,探讨了它们的优劣势和实际应用中的选择。

通过对两种算法的时间复杂度进行比较,可以更全面、深刻和灵活地理解深度优先算法和广度优先算法的特点和适用场景。

迷宫最短路径算法

迷宫最短路径算法

迷宫最短路径算法一、引言迷宫最短路径算法是指在迷宫中找到从起点到终点的最短路径的算法。

在实际应用中,迷宫最短路径算法可以用于机器人导航、游戏设计等领域。

本文将介绍几种常见的迷宫最短路径算法,包括深度优先搜索、广度优先搜索、Dijkstra 算法和 A* 算法。

二、深度优先搜索深度优先搜索是一种基于栈的搜索算法,其主要思想是从起点开始,沿着某个方向一直走到底,直到无路可走时回溯到上一个节点。

具体实现时,可以使用递归或手动维护栈来实现。

三、广度优先搜索广度优先搜索是一种基于队列的搜索算法,其主要思想是从起点开始,依次将与当前节点相邻且未被访问过的节点加入队列,并标记为已访问。

然后从队列头部取出下一个节点作为当前节点,并重复以上操作直到找到终点或队列为空。

四、Dijkstra 算法Dijkstra 算法是一种贪心算法,在图中寻找从起点到终点的最短路径。

具体实现时,首先将起点标记为已访问,并将其与所有相邻节点的距离加入一个优先队列中。

然后从队列中取出距离最小的节点作为当前节点,并更新其相邻节点到起点的距离。

重复以上操作直到找到终点或队列为空。

五、A* 算法A* 算法是一种启发式搜索算法,其主要思想是在广度优先搜索的基础上引入启发函数,用于评估每个节点到终点的估计距离。

具体实现时,将起点加入开放列表,并计算其到终点的估价函数值。

然后从开放列表中取出估价函数值最小的节点作为当前节点,并将其相邻未访问节点加入开放列表中。

重复以上操作直到找到终点或开放列表为空。

六、总结以上介绍了几种常见的迷宫最短路径算法,包括深度优先搜索、广度优先搜索、Dijkstra 算法和 A* 算法。

不同算法适用于不同场景,需要根据实际情况选择合适的算法。

在实际应用中,还可以结合多种算法进行优化,以提高寻路效率和精确度。

广度优先搜索

广度优先搜索
112源自FRONTREAR
一:交通图问题
表示的是从城市A到城市H 表示的是从城市A到城市H的交通图。从图中可以 看出,从城市A到城市H 看出,从城市A到城市H要经过若干个城市。现要 找出一条经过城市最少的一条路线。
分析该题
分析:看到这图很容易想到用邻接距阵来表示,0 分析:看到这图很容易想到用邻接距阵来表示,0表示能 走,1表示不能走。如图5 走,1表示不能走。如图5。
用数组合表示 8个城市的相互 关系
procedure doit; begin h:=0; d:=1; a.city[1]:='A'; a.pre[1]:=0; s:=['A']; repeat {步骤2} {步骤 步骤2} inc(h); {队首加一,出队} {队首加一 出队} 队首加一, for i:=1 to 8 do {搜索可直通的城市} {搜索可直通的城市 搜索可直通的城市} if (ju[ord(a.city[h])-64,i]=0)and ju[ord(a.city[h])-64,i]=0) not(chr(i+64) s)) ))then {判断城市是否走 (not(chr(i+64) in s))then {判断城市是否走 过} begin inc(d); {队尾加一,入队} {队尾加一 入队} 队尾加一, a.city[d]:=chr(64+i); a.pre[d]:=h; s:=s+[a.city[d]]; if a.city[d]='H' then out; end; until h=d; end; begin {主程序} {主程序 主程序} doit; end. 输出: 输出: H-F--A --A
深度优先搜索: 深度优先搜索:状态树

深度优先搜索和广度优先搜索

深度优先搜索和广度优先搜索

深度优先搜索和⼴度优先搜索 深度优先搜索和⼴度优先搜索都是图的遍历算法。

⼀、深度优先搜索(Depth First Search) 1、介绍 深度优先搜索(DFS),顾名思义,在进⾏遍历或者说搜索的时候,选择⼀个没有被搜过的结点(⼀般选择顶点),按照深度优先,⼀直往该结点的后续路径结点进⾏访问,直到该路径的最后⼀个结点,然后再从未被访问的邻结点进⾏深度优先搜索,重复以上过程,直⾄所有点都被访问,遍历结束。

⼀般步骤:(1)访问顶点v;(2)依次从v的未被访问的邻接点出发,对图进⾏深度优先遍历;直⾄图中和v有路径相通的顶点都被访问;(3)若此时图中尚有顶点未被访问,则从⼀个未被访问的顶点出发,重新进⾏深度优先遍历,直到图中所有顶点均被访问过为⽌。

可以看出,深度优先算法使⽤递归即可实现。

2、⽆向图的深度优先搜索 下⾯以⽆向图为例,进⾏深度优先搜索遍历: 遍历过程: 所以遍历结果是:A→C→B→D→F→G→E。

3、有向图的深度优先搜索 下⾯以有向图为例,进⾏深度优先遍历: 遍历过程: 所以遍历结果为:A→B→C→E→D→F→G。

⼆、⼴度优先搜索(Breadth First Search) 1、介绍 ⼴度优先搜索(BFS)是图的另⼀种遍历⽅式,与DFS相对,是以⼴度优先进⾏搜索。

简⾔之就是先访问图的顶点,然后⼴度优先访问其邻接点,然后再依次进⾏被访问点的邻接点,⼀层⼀层访问,直⾄访问完所有点,遍历结束。

2、⽆向图的⼴度优先搜索 下⾯是⽆向图的⼴度优先搜索过程: 所以遍历结果为:A→C→D→F→B→G→E。

3、有向图的⼴度优先搜索 下⾯是有向图的⼴度优先搜索过程: 所以遍历结果为:A→B→C→E→F→D→G。

三、两者实现⽅式对⽐ 深度优先搜索⽤栈(stack)来实现,整个过程可以想象成⼀个倒⽴的树形:把根节点压⼊栈中。

每次从栈中弹出⼀个元素,搜索所有在它下⼀级的元素,把这些元素压⼊栈中。

并把这个元素记为它下⼀级元素的前驱。

广度优先和深度优先的例子

广度优先和深度优先的例子

广度优先和深度优先的例子广度优先搜索(BFS)和深度优先搜索(DFS)是图遍历中常用的两种算法。

它们在解决许多问题时都能提供有效的解决方案。

本文将分别介绍广度优先搜索和深度优先搜索,并给出各自的应用例子。

一、广度优先搜索(BFS)广度优先搜索是一种遍历或搜索图的算法,它从起始节点开始,逐层扩展,先访问起始节点的所有邻居节点,再依次访问其邻居节点的邻居节点,直到遍历完所有节点或找到目标节点。

例子1:迷宫问题假设有一个迷宫,迷宫中有多个房间,每个房间有四个相邻的房间:上、下、左、右。

现在我们需要找到从起始房间到目标房间的最短路径。

可以使用广度优先搜索算法来解决这个问题。

例子2:社交网络中的好友推荐在社交网络中,我们希望给用户推荐可能认识的新朋友。

可以使用广度优先搜索算法从用户的好友列表开始,逐层扩展,找到可能认识的新朋友。

例子3:网页爬虫网页爬虫是搜索引擎抓取网页的重要工具。

爬虫可以使用广度优先搜索算法从一个网页开始,逐层扩展,找到所有相关的网页并进行抓取。

例子4:图的最短路径在图中,我们希望找到两个节点之间的最短路径。

可以使用广度优先搜索算法从起始节点开始,逐层扩展,直到找到目标节点。

例子5:推荐系统在推荐系统中,我们希望给用户推荐可能感兴趣的物品。

可以使用广度优先搜索算法从用户喜欢的物品开始,逐层扩展,找到可能感兴趣的其他物品。

二、深度优先搜索(DFS)深度优先搜索是一种遍历或搜索图的算法,它从起始节点开始,沿着一条路径一直走到底,直到不能再继续下去为止,然后回溯到上一个节点,继续探索其他路径。

例子1:二叉树的遍历在二叉树中,深度优先搜索算法可以用来实现前序遍历、中序遍历和后序遍历。

通过深度优先搜索算法,我们可以按照不同的遍历顺序找到二叉树中所有节点。

例子2:回溯算法回溯算法是一种通过深度优先搜索的方式,在问题的解空间中搜索所有可能的解的算法。

回溯算法常用于解决组合问题、排列问题和子集问题。

例子3:拓扑排序拓扑排序是一种对有向无环图(DAG)进行排序的算法。

图的搜索与应用实验报告(附源码)(word文档良心出品)

图的搜索与应用实验报告(附源码)(word文档良心出品)

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构与算法课程类型:必修实验项目名称:图的搜索与应用实验题目:图的深度和广度搜索与拓扑排序设计成绩报告成绩指导老师一、实验目的1.掌握图的邻接表的存储形式。

2.熟练掌握图的搜索策略,包括深度优先搜索与广度优先搜索算法。

3.掌握有向图的拓扑排序的方法。

二、实验要求及实验环境实验要求:1.以邻接表的形式存储图。

2.给出图的深度优先搜索算法与广度优先搜索算法。

3.应用搜索算法求出有向图的拓扑排序。

实验环境:寝室+机房+编程软件(NetBeans IDE 6.9.1)。

三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)数据类型定义:template <class T>class Node {//定义边public:int adjvex;//定义顶点所对应的序号Node *next;//指向下一顶点的指针int weight;//边的权重};template <class T>class Vnode {public:T vertex;Node<T> *firstedge;};template <class T>class Algraph {public:Vnode<T> adjlist[Max];int n;int e;int mark[Max];int Indegree[Max];};template<class T>class Function {public://创建有向图邻接表void CreatNalgraph(Algraph<T>*G);//创建无向图邻接表void CreatAlgraph(Algraph<T> *G);//深度优先递归搜索void DFSM(Algraph<T>*G, int i);void DFS(Algraph<T>* G);//广度优先搜索void BFS(Algraph<T>* G);void BFSM(Algraph<T>* G, int i);//有向图的拓扑排序void Topsort(Algraph<T>*G);/得到某个顶点内容所对应的数组序号int Judge(Algraph<T>* G, T name); };主程序流程图:程序开始调用关系:主函数调用五个函数 CreatNalgraph(G)//创建有向图 DFS(G) //深度优先搜索 BFS(G) //广度优先搜索 Topsort(G) //有向图拓扑排序 CreatAlgraph(G) //创建无向图其中 CreatNalgraph(G) 调用Judge(Algraph<T>* G, T name)函数;DFS(G)调用DFSM(Algraph<T>* G , int i)函数;BFS(G) 调用BFSM(Algraph<T>* G, int k)函数;CreatAlgraph(G) 调选择图的类型无向图有向图深 度 优 先 搜 索广度优先搜索 深 度 优 先 搜 索 广度优先搜索拓 扑 排 序程序结束用Judge(Algraph<T>* G, T name)函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图的广度优先搜索的应用◆内容提要广度优先搜索是分层次搜索,广泛应用于求解问题的最短路径、最少步骤、最优方法等方面。

本讲座就最短路径问题、分酒问题、八数码问题三个典型的范例,从问题分析、算法、数据结构等多方面进行了讨论,从而形成图的广度优先搜索解决问题的模式,通过本讲座的学习,能明白什么样的问题可以采用或转化为图的广度优先搜索来解决。

在讨论过程中,还同时对同一问题进行了深层次的探讨,进一步寻求解决问题的最优方案。

◆知识讲解和实例分析和深度优先搜索一样,图的广度优先搜索也有广泛的用途。

由于广度优先搜索是分层次搜索的,即先将所有与上一层顶点相邻接的顶点搜索完之后,再继续往下搜索与该层的所有邻接而又没有访问过的顶点。

故此,当某一层的结点出现目标结点时,这时所进行的步骤是最少的。

所以,图的广度优先搜索广泛应用于求解问题的最短路径、最少步骤、最优方法等方面。

本次讲座就几个典型的范例来说明图的广度优先搜索的应用。

先给出图的广度优先搜索法的算法描述:F:=0;r:=1;L[r]:=初始值;H:=1;w:=1;bb:=true;While bb dobeginH:=h+1;g[h]:=r+1;For I:=1 to w doBeginF:=f+1;For t:=1 to 操作数doBegin⑴m:=L[f]; {出队列};⑵判断t操作对m结点的相邻结点进行操作;能则设标记bj:=0,并生成新结点;不能,则设标记bj:=1;if bj:=0 then {表示有新结点生成}beginfor k:=1 to g[h]-1 doif L[k]=新结点then {判断新扩展的结点是否以前出现过}beginbj:=1;k:=g[h]-1end;if bj<>1 then {没有出现过} beginr:=r+1;L[r]:=新结点;{新结点进队列}b[r]:=f;c[r]:=t;{并链接指针,保存操作数} end; end; end; end;w:=r+1-g[h];s:=0;{计算新生成的一层的结点数}for k:=g[h] to r do {在新生成的一层结点中,判断是否有目标结点存在} if L[k]=目标结点 then begins:=s+1; {累计解的条数} 根据链接指针求出路径; end;if s:<>0 then begin输出s 条路径;bb:=false; {设程序结束条件} end; end;例1:最短路径问题求从任意一个顶点V i 出发,对给出的图,求到达任意顶点V j (i<>j )的所有最短路径 [问题分析]1、首先用邻接表表示此图各端点的邻接关系。

2、数据结构4 78constd:array[1..8,1..4] of byte=((2,3,4,0),(1,3,7,0),(1,2,4,5),(1,3,6,0),(3,6,7,8),(4,5,8,0),(2,5,8,0),(5,6,7,0)){二维数组存放邻接表}n:array[1..8] of byte=(3,3,4,3,4,3,3,3); {存放邻接顶点数}varL:array[1..64] of byte {队列}F,r:byte {f队头指针,r队尾指针}B:array[1..64] of byte {链接表,表示某一个结点的前趋结点}G:array[1..10] of byte {表示层结点的首结点在队列开始的位置}H:byte {搜索的层次}由于搜索过的点不再进行搜索,故设置一个数组E[M]为标记,表示结点M是否访问过e:array[1..8] of 0..1;{用1表示已访问过,0表示还没有访问}c:array[1..8,1..8]of byte; {C[s,j]存储到达目标结点后各最短路径的线路}bb:Boolean {搜索结束标记}3、算法描述⑴设立初值,并令起始结点进队:f:=0;r:=1;lL[r]:=st,E[st]:=1;w:=1;h:=1;⑵将此时第h层(开始h=1,表示第一层)的w(开始时w=1,表示一个结点)顶点的顺序出队,并访问与该层各顶点相邻接但又没有访问过的顶点,同时将这些结点进队列,且设立前趋链接指针和访问过标记,若此时的结点为目标结点,则只设立前趋链接指针而不设立访问过标记⑶计算此时第h+1层的顶点个数w:=r+1-g[h],然后看该层有多少个顶点为目标结点,凡是出现目标顶点的,就将其个数累计,也就是为最短路径的条数,同时从这个目标结点按前趋链接指针将到达该目标结点的路径的各个顶点编号存入c[s,j]中,然后转⑷,若目标顶点累计个数为0,表明该层没有出现目标结点,则转⑵。

⑷打印搜索到的各条最短路径的各结点编号,并结束程序。

程序如下:(见exp7_1.pas)program exp7_1;constd:array[1..8,1..4] of byte=((2,3,4,0),(1,3,7,0),(1,2,4,5),(1,3,6,0),(3,6,7,8),(4,5,8,0),(2,5,8,0),(5,6,7,0));n:array[1..8] of byte=(3,3,4,3,4,3,3,3);varL,b:array[1..64] of byte;F,r,h,m,st,ed,I,j,t,k,s,p,w:byte;G:array[1..10] of byte;e:array[1..8] of 0..1;c:array[1..8,1..8]of byte;bb:Boolean;beginwrite('start:');readln(st);write('end:');readln(ed);fillchar(e,sizeof(e),0); {标记数组清零}fillchar(c,sizeof(c),0); {路径数组清零}f:=0;r:=1;L[r]:=st;h:=1;w:=1;bb:=true;while bb dobeginh:=h+1;g[h]:=r+1; {记录h+1层的首地址}for i:=1 to w dobeginf:=f+1;m:=L[f];e[m]:=1; {取队首结点,并设访问过标记}for t:=1 to n[m] do {依次访问m结点的相邻结点}if e[d[m,t]]=0 then {若m的相邻结点没有访问过}beginr:=r+1;L[r]:=d[m,t];b[r]:=f; {则进队列}end;end;w:=r+1-g[h]; {计算第h层的新结点数目}s:=0;for k:=g[h] to r do {检查第h层上的新结点是否存在目标结点}if L[k]=ed then {等于目标结点}begins:=s+1;p:=b[k];j:=1;c[s,j]:=L[k];while p<>1 dobegin j:=j+1;c[s,j]:=L[p];p:=b[p]; end;j:=j+1;c[s,j]:=L[p];for t:=j downto 1 doif t=1 then writeln(c[s,t]) else write(c[s,t],'-→');end;if s<>0 thenbeginwriteln(st,'-→',ed,'total=',s,'step=',j-1);bb:=false;end;end;end.输入:start:1end:8输出:1-→2-→7-→81-→3-→5-→81-→4-→6-→81-→8 total=3 step=3输入:start:2end:6输出:2-→1-→4-→6 2-→3-→4-→6 2-→3-→5-→6 2-→7-→5-→6 2-→7-→8-→6 2-→1-→4-→62-→6 total=5 step=3 推广应用(作业题1):如下图表示的是从城市A 到城市H 的交通图,从图中可以看出,从城市A 到城市H 要经过若干个城市。

现要找出一条经过城市最少的一条路线。

例2:分酒问题有一8斤酒瓶装满酒,没有量器,只有两个分别能装5斤和3斤的空酒瓶。

试设计一程序将8斤酒对分为两个4斤,并以最少的步骤给出答案。

[问题分析]1、 分析在倒酒过程中,看起来是每一次倒酒,上面的六种操作都可能进行,然而有此操作却是无意义的。

如8斤瓶空时,则8→3、8→5是无意义的。

又如8斤瓶满时,则5→8、3→8操作无意义。

因此,每次倒酒操作后,都必须知道此时三个酒瓶到底多少酒,这样才能准确判断此时何种操作不能进行,何种操作可以进行。

为了表示每操作一次后各酒瓶中的酒量,设变量M 表示8斤瓶在进行第i 操作后装的酒量,N 表示5斤瓶在进行第i 操作后装的酒量,A 表示3斤瓶在进行第i 操作后装的酒量,由于整个酒量为8,所有A=8-M-N 。

对以上六种操作能和不能进行的条件如下:8→5操作:不能进行的条件为:N=5或M=0能进行时,剩余量为:N=N+M ,此时如果N>5,则M=N-5,N=5,否则M=0 8→3操作:不能进行的条件为:8-N-M=3或M=0 能进行时,剩余量为:如果M<3-(8-M-N ),则M=0,否则M=5-N ,N 不变 5→8操作:不能进行的条件为:M=8或N=0能进行时,剩余量为:M=N+M 且N=0 5→3操作:不能进行的条件为:8-N-M=3或N=0能进行时,剩余量为:如果N<3-(8-M-N ),则N=0,否则N=5-M ,M 不变 3→8操作:不能进行的条件为:8-N-M=0或M=8 能进行时,剩余量为:M=8-N ,N 不变A B C D G E FH3→5操作:不能进行的条件为:8-N-M=0或N=5能进行时,剩余量为:N=8-M,M不变2、定义数据结构constd:array[1..6] of string[4]=(‘8->5’,’8->3’,’5->8’,’5-3’,’3-8’,’3-5’); {6种操作}varL:array[1..50,1..2] of shortint; {表示倒酒后8斤和5斤瓶中的剩余量}B:array[1..50] of shortint; {每一层的各结点的前趋结点的链指针}C: array[1..50] of shortint; {每进行一次操作的操作数}E:array[1..10,1..20] of shortint;{最少步骤的所有解中,该层各结点是由上一层各结点通过何种操作而得到的操作数}X,y:array[1..10,1..20] of shortint ;{在最少步骤所有解中,各层的结点其8斤和5斤瓶中的剩余量}G:array[1..20] of shortint; {各层结点的首结点在队列的位置}F,r,h,w,n,m:shortint; {f为队列首指针,r为队列尾指针,m,n分别表示8斤和5斤瓶中的剩余量,h为搜索的层数,w为每一层结点的个数}3、算法描述:⑴设立队首队尾指针初值,f=0,r=1。

相关文档
最新文档