广度优先搜索算法实验报告(含算法实现思路,代码与运行结果,易错点提醒,以及实验中可能遇到的问题和解决办法)

实验项目名称

广度优先搜索

一、实验目的与要求:

  

目的:利用广度优先搜索算法,找到一条从起点到目标结点的最优路径。熟悉并掌握广度优先搜索算法的实现步骤以及算法流程,其核心思想是利用队列先进先出的特点,将已拓展的结点放在队列中,必要时记录其父节点,便于输出路径,不断拓展,若存在最优路径,则按要求输出路径或者到达目标结点所需的最短时间或者最短长度。

要求:编写几个使用广度优先搜索算法设计的程序,说明其大致的算法思路,调通程序并完成样例测试,完成实验报告。

二、实验设备及软件:

设备:荣耀笔记本电脑

软件:Visual Studio、浏览器、WPS、截图工具

三、实验方法(原理、流程图)

    

各算法大致思路如下:

1、Catch That Cow问题:

(1)定义结构体Step,其中整型变量x记录农夫所在的位置,steps记录农夫移动到x时所花费的时间,x与steps值均大于等于0,小于等于Max;

(2)用visited数组记录所有点的位置,若农夫已经经过该点,则值置为1,否则置为0;因为问题要求抓住牛的最少时间,为了提高搜索效率,所以规定:若该点已经经过,但没有得到最优路径,则不重复经过;

(3)初始时,将农夫的位置N入队,此时花费时间为0,即q.push(Step(N, 0));

然后当队列不为空时,首先判断队首元素s的x值是否恰好等于目标位置K,若是,则输出s的steps值,就是最少时间;若不是,则将队首元素s进行拓展,将拓展后的元素结点入队,最后让s出队;

(4)队首元素s的拓展:

①基本条件为:拓展后的结点元素位置>=0或者<=Max,而且其对应的visited数组值不能为1,即之前不能被访问过;

②拓展方式有3种:关键在于理清农夫位置的移动方式,分别是从s.x到s.x-1;从s.x到s.x+1;从s.x到2*s.x;每移动一次,s.steps值加1,相应的位置对应的visited数组值需要置为1。

(5)若队列中元素为空,则说明无论结点怎么拓展,都无法抓住牛,则退出程序,输出内容为空。

【注意队首元素出队,可以放在元素拓展完之后的else语句中,也可以放在if……else语句外,确保其最后执行即可】

2、拯救行动问题:

(1)输入数据涉及到二维数组,所以定义结构体Position,其中整型变量r记录骑士所在位置行数,c记录骑士所在位置列数,time记录骑士行动的时间,而且r不能超过N,c不能超过M,三者均大于等于0;

(2)用字符型二维数组a[i][j]记录牢房的布局,输入数据时,当发现骑士的位置‘r’时,对应i和j分别表示结构体中的行数r与列数c,此时time值为0,将初始元素入队,即q.push(Position(i, j, 0));

(3)在输入数据组数S不为0的while循环中,当队列不为空时,首先判断队首元素p,若再往上或者往下或者往左或者往右走一步,就能达到目标结点‘a’,则输出p的time值+1,就是行动的最短时间,然后退出循环;若预操作不能到达,则将队首元素p进行拓展,将拓展后的结点位置入队,最后让p出队;

(4)队首元素p的拓展:

①基本前提条件:记录骑士位置的下标r与c均不能越过数组下标的界限;牢房中‘#’表示墙壁,不能通行,骑士移动时需避开,‘x’表示守卫,若在拓展结点中,则需要战胜守卫;

②拓展方式有4种:分别是往下p.r+1;往上p.r-1;往右p.c+1;往左p.c-1;不能走有墙壁的地方,若遇到守卫,p.time+2,否则p.time+1;

(5)若经过拓展后,最终队列中元素为空,而且没有输出值后退出程序,则说明无论骑士怎么走,都无法拯救公主,则输出Impossible后,退出程序。

【程序中同样可以用visited数组记录牢房所有的位置以提高效率,若骑士已经经过则置为1,否则置为0,因为路径重复则意味着肯定不是最短时间】

3、鸣人与佐助问题:

【基本思路与拯救行动问题很像,但具体实现细节更复杂】

(1)定义结构体Information,与结构体Position相比,除了同样记录了鸣人行数r,列数c,所花费的时间time外,还记录了鸣人追上佐助过程中需要用到的查克拉数b,其中r与c不可越界,四者均大于等于0;

(2)用字符型二维数组a[i][j]记录地图的布局,输入数据时,当发现鸣人的位置‘@’时,对应i和j分别表示结构体中的行数r与列数c,此时b值与time值均为0,将初始元素入队,即q.push(Information(i, j, 0, 0));

(3)当队列不为空时,首先判断队首元素p,若再往上或者往下或者往左或者往右走一步,就能达到目标结点‘+’,此时还需判断走这条路径时用到的查克拉数p.b,若p.b<=T,说明这条路径是可行的,则输出p的time值+1,就是行动的最短时间,然后退出循环;若p.b>T,哪怕这条路径可以追上佐助,但是不可行,让队首元素p出队。若不能到达‘+’,则将队首元素p进行拓展,将拓展后的结点位置入队,最后让p出队;

(4)队首元素p的拓展:

①基本前提条件:记录骑士位置的下标r与c均不能越过数组下标的界限;地图中‘#’表示大蛇丸的手下,可以通行,但是每通过一个值为‘#’的地方,需要使用的查克拉数加1。

②拓展方式有4种:分别是往下p.r+1;往上p.r-1;往右p.c+1;往左p.c-1;若遇到大蛇丸的手下,则p.b+1,否则p.b不变;p.time一直都是加1

(5)若经过拓展后,最终队列中元素为空,而且没有输出值后退出程序,则说明无论鸣人怎么走,都无法追上佐助,则输出-1后,退出程序。

【本题中,不能用visited数组进行标记,因为通路太少,而且有查卡拉数限制,鸣人走的路线经过的结点需保证可以重复,才能找出最优解】

4、八数码问题:

(1)定义结构体Way,同样用整型变量r和c分别记录空格所在的行数与列数,

用string类型的变量direction记录空格移动的方向,r与c均不能越界,direction初始化为“”,上下左右移动时,direction分别加‘u’/‘d’/‘l’/‘r’;

(2)用goal数组记录目标状态,用字符型二维数组a记录输入的初始状态,用put数组记录元素是否归位,若已归位则置为1,否则置为0;用

(3)在输入数据时,当发现空格的位置‘x’时,对应i和j分别表示结构体中的行数r与列数c,并初始化字符串,将元素入队,即q.push(Way(i, j, ""));同时若元素在输入时已归位,则将对应的put数组中的值置为1;

(4)当队列不为空时,首先判断put数组中值是否全部为1,若是,则说明元素全部归位达到目标状态,flag=true时输出p的direction值,就是空格的移动序列,然后退出循环;若put数组不全部为1,则置flag=false,将队首元素p进行拓展,将拓展后的结点位置入队,最后让p出队;</

  • 39
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 知识分析: Kruskal算法广度优先搜索都是图论比较基础的算法,掌握这两个算法可以帮助学习者更好地理解图的基本概念和算法应用。 Kruskal算法是一种贪心算法,用于求解无向图的最小生成树。其核心思想是将图所有边按照权值从小到大排序,依次加入生成树,但要避免形成环路。Kruskal算法的时间复杂度为O(ElogE),其E为边的数量。 广度优先搜索(BFS)是一种图的遍历算法,用于确定无向图的连通分量。其核心思想是从起开始,按照距离逐层遍历,直到遍历到所有与起相连的节。BFS的时间复杂度为O(V+E),其V为节数,E为边的数量。 2. 相关性分析: Kruskal算法广度优先搜索都是图的基础算法,但应用场景不同。Kruskal算法用于求解最小生成树,而广度优先搜索用于确定连通分量。在实际应用,这两种算法可以结合使用,例如在求解网络的最短路径时,可以先使用BFS算法求解连通分量,然后在每个连通分量使用Kruskal算法求解最小生成树。 3. 遇到问题和解决方法: 在编写程序时,可能遇到以下问题: - 如何表示图的数据结构? - 如何实现Kruskal算法和BFS算法? - 如何读取图的输入数据? - 如何输出算法结果? 解决这些问题的方法包括: - 可以使用邻接矩阵或邻接表表示图的数据结构,具体选择哪种数据结构可以根据需要选择。 - 实现Kruskal算法和BFS算法的伪代码可以在学习资料查找,然后根据伪代码实现算法。 - 可以使用文件输入输出或标准输入输出等方式读取图的输入数据和输出算法结果。 - 在编写程序过程可能遇到语法错误、算法实现错误等问题,可以使用调试工具或参考学习资料进行调试和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚柚丰色tsy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值