Pascal广度优先搜索.ppt

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
09年暑假集训(二) ——广度优先搜索 广度优先搜索概念 广度优先是另一种控制结点扩展的策略,这种策略优先扩展深度小的结点,把问题的状态向横向发展。广度优先搜索法也叫BFS法(Breadth First Search),进行广度优先搜索时需要利用到队列这一数据结构。 广度优先搜索算法适应范围 如果问题的解是由若干部选择构成的一个选择序列,题目要求我们用最少的步骤解决最优化的问题,这个时候我们一般考虑是否使用广度优先搜索。 广度优先搜索具有很明确的解题结构,很容易掌握。 让我们来看个例子! 重排九宫问题游戏 在一个3乘3的九宫中有1-8的8个数及一个空格随机摆放在其中的格子里。如下面左图所示。现在要求实现这样的问题:将该九宫调整为如下图右图所示的形式。调整规则是:每次只能将与空格(上,下或左,右)相临的一个数字平移到空格中。试编程实现。 | 2 | 8 ?| 3 | ????????????????| 1 | 2 | 3 | - | 1 |???? | 4 | ????????????????| 8 |??? | 4 | | 7 |?6? | 5 |???????????????? | 7 | 6 | 5 | 特别提示 在有些情况下,比如求最优秀解的时候,有时广度搜索比深度搜索好; 一般来说广度优先搜索可以利用队列实现,主要用于求一种状态通过 几种规定的操作以最小次的变换到另一种状态 广度优先搜索基本算法 1)从某个顶点出发开始访问,被访问的顶点作相应的标记,并输出访问顶点号; ??? 2)从被访问的顶点出发,依次搜索与该顶点有边的关联的所有未被访问的邻接点,并作相应的标记。 ??? 3)再依次根据2)中所有被访问的邻接点,访问与这些邻接点相关的所有未被访问的邻接点,直到所有顶点被访问为止。 【算法过程框架】 procedure guangdu(i); begin write(i); v[i]:=true; insert(q,i);{q是队列,i进队} repeat k:=delete(q);{出队} for j:=1 to n do if (a[k,j]=1) and (not v[j]) then begin write(j); v[j]:=true; insert(q,j); end; until 队列q为空; 变化的就是每个节点的表示形式和扩展的策略 例一、分油问题 假设有3个油瓶,容量分别为4,3,1(斤)。开始时4斤油瓶是满的,另外两个是空的,请用这三个油瓶将倒出2斤的油来 分析:由于每一次倒油都是从一个油瓶向另外一个油瓶倒油,要么向外倒油的油瓶倒空,要不接受倒油的油瓶道满。我们将三个油瓶编号,用三个油瓶的油表示当前状态,共有六种不同的倒油方法1-2;1-3;2-3;2-1;3-2;3-1;(相当于八种跳马的方案,回溯的条件是该状态在以前出现过,而我们现在不但要求出一种解,而且我们要的出最优化(操作次数最少的解),也就是我们要求我们搜索树的层最少) 深度优先搜索:状态树 状态树(广度优先搜索) 广度优先搜索所用的数据结构 一:交通图问题 表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。 分析该题 分析:看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图5。 利用队列广度搜索 首先想到的是用队的思想。我们可以a记录搜索过程,a.city记录经过的城市,a.pre记录前趋元素,这样就可以倒推出最短线路。具体过程如下:   (1) 将城市A入队,队首、队尾都为1。   (2) 将队首所指的城市所有可直通的城市入队(如果这个城市在队中出现过就不入队,可用一个集合来判断),将入队城市的pre指向队首的位置。然后将队首加1,得到新的队首城市。重复以上步骤,直到城市H入队为止。当搜到城市H时,搜索结束。利用pre可倒推出最少城市线路。 参考程序 const ju:array[1..8,1..8] of 0..1=((1,0,0,0,1,0,1,1),                (0,1,1,1,1,0,1,1),                (0,1,1,0,0,1,1,1),                (0,1,0,1,1,1,0,1),                (1,1,0,1,1,1,0,0),                (0,0,1,1,1,1,1,0),                (1,1,1,0,0,1,1,0

文档评论(0)

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

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

1亿VIP精品文档

相关文档