




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、宽宽 度度 优优 先先 搜搜 索索安庆四中安庆四中 丁贤友丁贤友一、队列一、队列l队列是先进先出的线性表,它仅允许在表的后端进行插入操作,在表的前端进行删除操作。queue1queue2queuen出队出队队头队头队尾队尾入队入队队列操作队列操作 l在设计队列的常用操作时,用front指针控制队头,每次从队列中移出一个queuei时,置front增长1,使得队头指针往后移一位;用rear指针控制队尾,每插入一个queuei,置rear增长1;初始时,队列为空,front、rear都为0。队列的常用操作有入队、出队、判空等操作。lfront:对头指针,指向实际队头元素的前一个位置lrear: 队
2、尾指针,指向实际队尾所在的位置队列定义队列定义l队列的定义lMaxsize=队列中元素的上限;lType l queue=recordl data:array1.maxsize of datatype;l front,rear:0.maxsize;l end;lVar q:queue;队列操作队列操作l初始化队列过程lProcedure qcreate(var q:queue);l begin q.front:=0; q.rear:=0 end;l判断队列是否为空lFunction qempty(q:queue):boolean;l begin qempty:=(q.front=q.rear)
3、; end;l判断队列是否为满lFuntion qfull(q:queue):boolean;l begin qfull:=(q.rear=maxsize); end;队列操作队列操作l入队过程lProcedure inqueue(var q:queue; x:datatype);l beginl if qfull(q) then writeln(queue is full!);l else beginl inc(q.rear);l q.datarear:=x;l end;l end;队列操作队列操作l出队过程lProcedure outqueue(var q:queue; var x:dat
4、atype);l beginl if qempty(q) then writeln(queue is empty)l else beginl inc(q.front);l x:=q.dataq.front;l end;lEnd;例题例题1:BFSl给定一张给定一张N个顶点、个顶点、E条边的无向图,请用条边的无向图,请用BFS从顶点从顶点1遍历这张图。遍历这张图。l输入文件:输入文件:l第一行为第一行为N、E,意思如题意;,意思如题意;l以下以下E行,每行行,每行2个整数,代表个整数,代表2个顶点的编号,表示他们之间有边个顶点的编号,表示他们之间有边连接。连接。l输出文件:输出文件:l输出一行,
5、从顶点输出一行,从顶点1广搜的顶点的编号,用空格隔开。广搜的顶点的编号,用空格隔开。l输入样例:输入样例:l6 5l1 2l1 3l2 4l输出样例:输出样例:l1 2 3 4 5 6【分析【分析】lBFS的原理为从源点出发,先搜索出所有与源点相连接的点,再搜索出与这些点相连的其它点,它是逐层遍历出所有与源点相连的点。这种原理恰好与队列的先进先出相吻合,可以用队列实现BFS。分以下3个步骤来实现:l初始时,顶点1入队,并输出顶点1;l判断队列是否为空,不为空时,取出队首元素queuefront,再将与队首元素相连的所有顶点入队,并都输出;l重复操作,直至队列为空。l当顶点比较多时,队列易出现假
6、溢出情况,可以用循环队列来实现。在存储队列的数组中,用front、rear两个指针控制首位元素。lProcedure bfs(i:longint);l front 0; rear 1; queuerear i; write(i, );l flagi true;l while frontrear dol beginl inc(front); tmp queuefront;l for j 1 to n dol beginl if (not flagj) and pathtmp,j=1 thenl beginl write(j, ); inc(rear); queuerear j;l flagj t
7、rue;l end;l end;l end;广广 搜搜l广搜又叫广度优先搜索。它是从源点出发,逐层搜索出所有的点。广搜一般用在求最少步数的情况,由于它的逐层特性,它能保证搜到最小或最少的解。例例2:找目标:找目标l给定一幅给定一幅nn的图,图中有的图,图中有.,#和和* ,*代表起代表起点,点, #代表目标点,从起点到目标点走时,只能向上、代表目标点,从起点到目标点走时,只能向上、下、左、右四个方向走,每次只能走一步,且不能走斜线。下、左、右四个方向走,每次只能走一步,且不能走斜线。问从起点,经过最少几步,能到达目标点。问从起点,经过最少几步,能到达目标点。l输入数据:输入数据: nn的地图的
8、地图l输出数据:最少的步数。输出数据:最少的步数。l输入样例输入样例l. . . .l. * . .l. . . .l. . . #l输出样例:输出样例:l4【分析【分析】l题目要求,从源点出发,以最少的步数到达目标点,如果用深搜的话,需要搜索出所有可行方案,找出其中步数最少的点;用广搜的话,从源点开始,逐层拓展,找到目标点时,即为 最少的步数。广搜算法实现时,可以用队列来存储拓展出来的每层状态。l算法实现时,用算法实现时,用dx,dy一维数组预存一维数组预存4个拓展方向的个拓展方向的x,y坐标的增量,用坐标的增量,用disti,j数组记录到达数组记录到达i,j点的步数,用点的步数,用si,j
9、数组记录每个点的初始状态,用队列数组记录每个点的初始状态,用队列q记录入队、出记录入队、出队情况。队情况。ldx:array1.4 of longint=(0,0,1,-1);ldy:array1.4 of longint=(1,-1,0,0);lTnode=record x,y:longint end; lDist:array0.205,0.205 longint; lS:array0.205,0.205 of char; /记录每个点的初始状态记录每个点的初始状态lq:array0.205*205 of tnode; /用队列存储用队列存储广搜过程如下:广搜过程如下:lProcedure bfs;l fillchar(dist,sizeof(dist),-1);ldistx0,y0:=0;lh0; r1;lqr.x x0; qr.y y0; /起点入队起点入队lwhile (h=1) and (xx=1) and (yy=n)l and d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育用户体验设计考核试卷
- 果蔬汁饮料的环保包装材料与循环利用考核试卷
- 按摩器维修指南考核试卷
- 信息化物流师实践与试题及答案探讨
- 交流与合作的2024年图书管理员考试试题及答案
- 预算员考试知识整合与试题及答案
- 有机硅功能海洋防污涂层的制备与性能研究
- 生产经营负责人安全培训考试题含完整答案【典优】
- 高非线性硫系玻璃光子晶体光纤的设计与分析
- 面向ADCP宽频测流的信号处理算法研究与FPGA实现
- 仓库出入库规定及出入库流程
- 新版旁站监理实施细则
- 中建支吊架专项施工方案
- 健康管理中的健康教育与健康促进研究
- 数控铣床加工中心编程及加工中职PPT完整全套教学课件
- 江苏省建筑工程质量通病防治手册
- 2023上海虹口区初三二模英语试题及答案
- 拐杖的使用课件
- ChatGPT人工智能技术介绍PPT
- 常见探地雷达数据格式
- 小学道德与法治-圆明园的诉说教学设计学情分析教材分析课后反思
评论
0/150
提交评论