- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)