收藏 分享(赏)

深度优先算法.doc

上传人:11xg27ws 文档编号:6546167 上传时间:2019-04-16 格式:DOC 页数:7 大小:226.50KB
下载 相关 举报
深度优先算法.doc_第1页
第1页 / 共7页
深度优先算法.doc_第2页
第2页 / 共7页
深度优先算法.doc_第3页
第3页 / 共7页
深度优先算法.doc_第4页
第4页 / 共7页
深度优先算法.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、常用算法深度优先搜索(degree first serch)吴孝燕一、 深度优先搜索的基本思路把一个具体的问题抽象成了一个图论的模型树(如图)。状态对应着结点,状态之间的关系(或者说决策方案)对应着边。这样的一棵树就叫搜索树。(一)基本思路1 、在每个阶段的决策时,采取能深则深的原则试探所有可行的方案,一旦深入一层则保存当前操作引起的状态。2 、一旦试探失败,为了摆脱当前失败状态,采取回到上一阶段尝试下一方案的策略(回溯策略);或者在求解所有解时,求得一个解后,回溯到上一阶段尝试下一方案,以求解下一个解。3 、在各个阶段尝试方案时,采取的是穷举的思想。(二)引题【例 1】选择最短路径。有如下所

2、示的交通路线图,边上数值表示该道路的长度,编程求从 1 号地点到达 7 号地点的最短的路径长度是多少,并输出这个长度。数据结构1、邻接矩阵表示图的连接和权值。AI,j=x,或者 aI,j=maxint。Bi表示结点 i 是否已经遍历过。2、用变量 min 来保存最优解,而用 tot 变量保存求解过程中临时解(当前路径总长度)。3、状态。Tot 的值和结点的遍历标志值。程序结构1、递归结构。2、主程序中用 try(1)调用递归子程序 。3、子程序结构。procedure try(I:integer);var k:integer;begin if 到达了终点 then begin 保存较优解;返回

3、上一点继续求解(回溯);end else begin 穷举从 I 出发当前可以直接到达的点 k; if I 到 k 点有直接联边 并且 k 点没有遍历过 then then begin 把 AI,K累加入路径长度 tot;k 标记为已遍历;try(k); 现场恢复; end; end;子程序procedure try(i:integer);var k:integer;beginif i=n then begin if totk) and (ai,k5 then printelse beginfor j:=1 to 5 doif not(j in flag) and (likei,j0) the

4、nbegin flag:=flag+j;booki:=j;try(i+1);flag:=flag-j;endend;end;beginflag:=;c:=0;try(1);readln;end.例 2: 中国象棋棋盘如下图马自左下角往右上角跳.规定只许往左跳,不许往右跳(如图跳法)编程找出所有跳法。program tiaoma;constdi:array14 of integer=(1,2,2,1);dj:array14 of integer=(2,1,-1,-2);var x,y:array020 of integer;c:integer;procedure print(dep:intege

5、r);var j:integer;beginc:=c+1;write(c,:);for j:=0 to dep-1 do write(,xj,yj,)-);writeln(,xdep,ydep,);end;procedure try(dep,i,j:integer);var r,ni,nj:byte;beginif (i=8) and (j=4) then print(dep-1)else beginfor r:=1 to 4 dobeginni:=i+dir;nj:=j+djr;if (ni0)and(ni=0)and(njbest then begin best:=max;answer:=

6、now; end; exit; end; for i:=last+1 to max+1 do begin nowp+1:=i; h:=0; fillchar(can,sizeof(can),false); can0:=true; for j:=1 to n do get(p+1,h); for j:=1 to h+1 do if not canj then begin ma:=j-1;break;end; solve(p+1,i,ma); end; end; main begin readln(n,k); best:=0; solve(0,0,0); i:=0 2、NOIP2001 数的划分

7、将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入:n,k (6=pre then inc(r); exit; end; for j:=pre to s div 2 do work(dep+1,j,s-j); end; 也可利用回溯思想 procedure try(dep:integer); var i:integer; begin if dep=k then begin if tot=adep-1 then inc(sum); exit; end; for i:=adep-1 to tot div 2 do begin adep:=i; dec(tot,i); try(dep+1); inc(tot,i); end; end;try 深度优先搜索算法是算法设计中最为基本的算法。大多数的题可以用它来解决,但是深度优先搜索算法的运算速度慢,而竞赛试题对程序出解的时限有严格的要求,因此必须对搜索加以优化。优化一般有以下三种方法:(1)缩小搜索范围;(2)改变搜索次序;(3)剪枝。当然,解决问题有多种方法,能用效率更高的算法那更佳。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报