基本搜索算法之广度搜索.docVIP

  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文档。上传文档
查看更多
基本搜索算法之广度搜索

基本搜索算法之广度搜索 例题: 给出一个由1,2,3,4,5,6组成的6位数,相邻的两个数字可以交换位置,问最少经过多少次交换,可以到达另一个目标6位数。例如: 对于123456,最少经过两次交换,可以变成231456。 分析:这个题目与前面讲过的深度搜索相比有一个明显不同,会出现“又回去了”的情况(产生树的分支有连通的情况),例如:由123456可以变成213456,而213456又可以变成123456,这样形成了循环。所以需要我们用广度搜索来完成,需要的预备知识是《数据结构》中的队列。关键点在“最少次数及解决树的分支连通问题”。 例程: const n=6; var p1:integer; {队列出列指针,指向openx表} p2:integer; {队列入列指针, 指向openx表} openx:array[1..1000] of string[n]; {存放已经出现过的6位数} openy:array[1..1000] of integer; {存放树(tree)的前缀层数,即当前移动次数} st1:string; {初始状态,一个6位数} st2:string; {目标状态,一个6位数} st:string; i:integer; tc:char; function find(stx:string):boolean; {对生成新的状态进行判重} var i:integer; begin for i:=1 to p2 do if stx=openx[i] then begin find:=false;exit;end; find:=true; end; procedure out; {结果输出} begin writeln(openy[p1+1]); halt; end; begin readln(st1); readln(st2); p1:=1;p2:=1;openx[1]:=st1; {初始设置} fillchar(openy,sizeof(openy),0); while p1=p2 do begin for i:=1 to n-1 do {对当前x[p1]状态,生成所有有效分支} begin st:=openx[p1]; tc:=st[i];st[i]:=st[i+1];st[i+1]:=tc; {交换位置I和i+1中的数字} if st=st2 then {达到目标状态,转向结果输出} out; if find(st) then {判重} begin inc(p2);openx[p2]:=st; {队列入列操作} openy[p2]:=openy[p1]+1; {取得当前树的扩展层数,即:移动次数} end; end; inc(p1); {队列出列操作} end; end. 有一些资料的描述是,把队列放在一个独立的线性表中,上面的程序是直接把队列放在数组openx中,这样节约一些空间。显然DFS的时间效率体现在“判重”的算法上,提高时间效率方法很多,其中hash表是重要的一种算法,请参看相关资料。 例题二 有10升油在10升的容器中,另有两个7升和3升的空容器,要求用这三个容器倒油,使得最后在10升和7升的容器中各有5升油,问最少的倒油次数是多少? var a:array[1..3] of integer; {每个容器的容量} x:array[1..1000,1..3] of shortint; {存放已经出现过的状态} y:array[1..1000] of integer; {存放树(tree)的前缀层数,即当前倒油次数} b:array[1..3] of integer; {目标状态} c:array[1..3] of integer; p1:integer; p2:integer; i,j,t:integer; pt:boolean; procedure init; begin assign(input,xx1.txt); reset(input); readln(a[1],a[2],a[3]); readln(x[1,1],x[1,2],x[1,3]); {读取初始状态} readln(b[1],b[2],b[3]); {读取目标状态} close(input); end; procedure out; begin writeln(y[p1]+1); halt; end; function find:boolean; var i:integer; begin for i:=1 to p2 do if (c[1]=x[i,1]) and (c[2]=x[i,2]) and (c[3]=x[i,3]) then begin find:=false;exit;end; find:=true; end

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档