深度优先搜索.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
日I!所谓深度 日 I! 所谓深度 展的策略,这种策略是优先扩展深度大的结点, 索也叫做 DfS 法(Depth First Search) 深度优先搜索 对产生问题的状态结点而言的,”深度优先”是一种控制结点扩 把状态向纵深发展。 深度优先搜 。深度优先搜索的递归实现过程: procedure dfs(i); for j:=1 to r do if 子结点mr符合条件then产生的子结点 mr入栈; if 子结点 mr是目标结点then 输出 else dfs(i+1); 栈顶元素出栈(即删去 mr); en dif; en dfor; [例1]骑士游历: 设有一个n*m的棋盘,在棋盘上任一点有一个中国象棋马 IU 当N,M输入之后,找出一条从左下角到右上角的路径。 例如:输入N=4,M=4, 输出:路径的格式:(1,1)-(2,3)-(4,4) ,若不存在路径,则输出no 算法分析:我们以4 X4的棋盘为例进行分析, 用树形结构表示马走的所有过程, 求从起点到终点的路径,实际上就是从根结点开始深度优先搜索这棵树。 马从(1 , 1)开始,按深度优先搜索法,走一步到达(2, 3),判断是否到达终 点,若没有,则继续往前走, 再走一步到达 (4,4),然后判断是否到达终点, 若到达则退出, 搜索过程结束。 为了减少搜索次数, 在马走的过程中, 判断下 一步所走的位置是否在棋盘上,如果不在棋盘上,则另选一条路径再走。 [1..4]of in teger=(2,2,1,1); [仁4]of in teger=(1,-1,2,-2); [1..4]of in teger=(2,2,1,1); [仁4]of in teger=(1,-1,2,-2); con st dx:a dy:afr type map=record x,y:i nteger; end; var i,n ,m:i nteger; a:array[0..50]of map; procedure dfs(i:i nteger); var j,k:i nteger; begi n for j:=1 to 4 do if (a[i-1].x+dx[j]0)a nd(a[i-1].x+dx[j]v=n) an d(a[i-1].y+dy[j]0)a nd(a[i-1].y+dy[j]v=n) the n{ 判断是否在棋盘上 } begin a[i].x:=a[i-1].x+dx[j]; a[i].y:=a[i-1].y+dy[j];{ 入栈} if (a[i].x=n)an d(a[i].y=m)the n begin write((,1,,,1,)); for k:=2 to i do write(-(,a[k].x,,,a[k].y,)); halt;{ 输出结果并退出程序} end; dfs(i+1);{ 搜索下一步} a[i].x:=0;a[i].y:=0;{ 出栈} end; end; begi n a[1].x:=1;a[1].y:=1; readl n(n ,m); dfs(2); write In ( no); end. 从上面的例子我们可以看出,深度优先搜索算法有两个特点: 1、 己产生的结点按深度排序, 深度大的结点先得到扩展, 即先产生它的子结点。 2、 深度大的结点是后产生的,但先得到扩展,即“后产生先扩展”,与栈的 工作原理相同,因此用堆栈作为该算法的主要数据结构,存储产生的结点。 对于不同的问题, 深度优先搜索算法基本上是一样的, 但在具体处理方法和编程 技巧上又都不相同,甚至会有很大的差别。我们再看看另一个例子。 k(k v n)。从 n个整 n=4 , k(k v n)。从 n个整 n=4 , k = 3, 4 个整 3 + 7 + 12=22 3 [问题描述]:已知n 个整数x1,x2,,,xn ,以及一个整数 数中任选k个整数相加,可分别得到一系列的和。例如当 数分别为3 , 7, 12, 19时,可得全部的组合与它们的和为: + 7 + 19 = 29 7 + 12 + 19 = 38 3 + 12 + 19 = 34。现在,要求你计算出和为 素数共有多少种。例如上例,只有一种的和为素数: 3 + 7 + 19 = 29。 [输入]:键盘输入,格式为: n , k (1=n=20 , kv n) x1,x2 , ,,xn ( 1=xi=5000000 ) [输出]:屏幕输出,格式为: 一个整数(满足条件的种数)。 [输入输出样例]: 输入:4 3 3 7 12 19 输出:1 算法分析:本题是求从n个数中选k个数的组合,并使其和为素数。 求解此题时, 先用深度优先搜索法生成k个数的组合, 再判断k个数的和是否为素数, 若为素数 则总

文档评论(0)

my0024 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档