- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
广度优先搜索 引例 经过城市最少的一条路径 小结 广度搜索求解跳马问题 八数码问题 小鼠迷宫问题 [最少步数] 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生设想:如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个19×19的围棋的围棋盘上任选两点A,B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走。俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A,B两点的坐标,想知道两个位置到(1,1)点的可能的最少步数。 输入: 12 16 18 10 输出: 8 9 分析: 由于A,B两点是随机输入的,因此我们无法找到计算最少步数的数学规律,只能通过广度优先搜索的办法求解。 (1)确定出发点 从(x,y)出发通过一次广度优先搜索,可以找到从(x,y)至棋盘上所有可达到的点的最少步数。而问题中要求的是黑马所在的(x1,y1)和白马所在的(x2,y2)到达(1,1)目标点的最少步数。虽然两条路径的起点不同,但它们的终点却是相同的。如果我们将终点(1,1)为起点,这样只需要一次广度搜索便可以得到(x1,y1)和(x2,x2)到达(1,1)的最小步数。 (2)数据结构 设: que——队列,存储从(1,1)可到达的点(que[k,1..2]) 以及到达该点所需要的最小步数(que[k,3])(0≤k≤19^2+1)。队列的首指针为closed,尾指针为open。初始时,que中只有一个元素为(1,1),最少步数为0。 s——记录(1,1)到每点所需的最少步数。显然,问题的答案是s[x1,y1]和[x2,y2] 。初始时,s[1,1]为0,除此之外的所有元素的值均设为-1。为了使马从棋盘内任意位置扩展出的坐标均在s的范围内,我们将s的数组的范围扩大至s[-1..21,-1..21]。 dx,dy——移动后的位置增量数组。马有12种不同的扩展方向: 马走“日”:(x-2,y-1),(x-1,y-2),(x-2,y+1),(x-1,y+2),(x+2,y-1),(x+1,y-2),(x+2,y+1),(x+1,y+2)。 马走“田”:(x-2,y-2),(x-2,y+2),(x+2,y-2),(x+2,y+2). * 广度优先搜索在树中又叫按层次遍历,对于树而言,宽度优先搜索的思路可以描述为:访问根结点,依次访问根结点的每一个子结点(第二层),再通过这些结点访问第三层结点……。广度优先与深度优先搜索相比,时间复杂度都是相同的,不同的仅仅在于结点访问的顺序不同。它们在完全遍历的问题上应该是差不多,但是在有些问题上,比如求最优解,有时广度优先要比深度优先搜索好。 为了求一个最优解,如果使用深度优先并不能保证找到的解最优,只有搜索完整棵树,找到所有解,再比较它们的优劣,才能从中求出最优解,这显然不如广度优先搜索简单。 一般来说广度优先搜索可以利用队列实现,主要用于解决求一种状态通过几种规定的操作以最少次数变换到另一种状态的问题。 状态描述(矩阵表示): 1表示不相邻 0表示相邻 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), (1,1,1,1,0,0,0,1)); 结点定义 type node=record city:char;{城市名称} pre:integer;{父结点} end; var head,tail,i:integer;{队列首与队列尾} a:array[1..100]of node;{结点数} s:array[‘A’..‘H’]of boolean;{城市数} procedure out(d:integer);{输出过程,通过每
文档评论(0)