网站大量收购闲置独家精品文档,联系QQ:2885784924

广度搜索在程序设计中的应用.ppt

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
广度搜索在程序设计中的应用

广度搜索在程序设计中的应用 东莞信息学奥赛中心组 深度优先: S L M N F F O P F Q F “广搜”用来解决那类问题? 用深度优先搜索找最优解时必须搜索完所有路径,即使一个目标结点在很浅的树枝上,也得等到它左边所有结点均被搜索后才能找到它。用这种方法求某些最优解时,效率比较低。而广度优先搜索,能较好地解决这个问题。 广度优先搜索是最简便和常用的图形搜索算法之一,从对图形的遍历来看,遵循“从浅入深”的搜索策略。在这种搜索过程中,树上的结点扩展是沿着深度的“断层”进行的,所以这种方法一定能保证找到最短(步数最少)的解答序列。在不少题中要求找到经历步骤最少而达到目标的方案时,多采用此种搜索方法。 “广搜”所用的数据结构-队列 为了体现先生成先扩展的执行方式又能保留所有生成的结点以待进一步扩展,广度优先搜索在数据结构上引用了“队列”结构。队列是一种线性表,具有先进先出的特点,对于它所有的插入和删除操作分别仅在队列尾和队列首进行。定义两个“指针”变量head和tail,分别用来指向队列的头和尾。初始结点先入队,头指针指向待扩展结点,每生成一个子结点,则尾指针tail增加1,当前结点的所有子结点均生成后,头指针向后移动(即加1),位于head指针之前的(已被删除)为已扩展结点,tail指向所有已生成结点的最后一个。若head指针大于tail指针,表示所有解答树上的结点已产生。如果目标结点仍求出现,说明“无解”。 原理解析 广度优先搜索的算法描述 Procedure BFS 初始化,初始状态存入OPEN表; 队列首指针head:=0;尾指针tail:=1; repeat for I:=1 to max do //其中,max为产生子结点的规则数 begin if 子结点符合条件 then begin tail指针增1,把新结点存入队列尾; if 新结点与原已产生的结点重复 then 删去该结点(取消入队,tail减1) else if 新结点是目标结点 then 输出并退出; end end until (head=tail); 广度优先搜索的注意事项 (1)每生成一个子结点,就要提供指向它们父亲结点的指针。当解出现时,通过逆向跟踪,找到从根结点到目标结点的一条路径。 (2)生成的子结点要与前面的所有已产生结点比较,以免出现重复结点,浪费时间,还可能陷入死循环。 (3)广度优先搜索的效率还有赖于目标结点所有位置情况,如果目标结点处在比较深的层上时,需搜索的结点数基本上以指数增长。 例1:电子老鼠闯迷宫 电子老鼠闯迷宫。如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。 数据结构定义: A[1..maxn,1..maxn]表示邻接矩阵 Father[1..maxn*maxn]表示队列 State[1..maxn*maxn,1..2],1表示当前点的横坐标,2表示纵坐标,记录状态 procedure bfs; var tail,head,k,i:integer; begin head:=0;tail:=1;state[1,1]:=px;state[1,2]:=py; father[1]:=0; //初始点状态 repeat for k:=1 to wayn do if check(state[head,1]+dx[k],state[head,2]+dy[k]) //扩展子节点 then begin tail:=tail+1;//入队 father[tail]:=head; state[tail,1]:=state[head,1]+dx[k]; state[tail,2]:=state[head,2]+dy[k]; a[state[tail,1],state[tail,2]]:=1;//判重标记 if (state[tail,1]=qx) and (state[tail,2]=qy)//是否为目标节点 then begin print(tail); tail:=0; end; end;

文档评论(0)

beoes + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档