- 1、本文档共61页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
队列宽搜及其优化
const dx:array[1..5]of longint=(0,1,0,-1,0); dy:array[1..5]of longint=(1,0,-1,0,0); var a:array[-1..400,-1..400] of longint; m,i,j,head,tail,time,xi,yi:longint; x,y,t:longint; q:array[0..10000,0..2] of longint; begin assign(input,meteor.in); reset(input); assign(output,meteor.out); rewrite(output); readln(m); for i:=-1 to 301 do for j:=-1 to 301 do a[i,j]:=maxlongint; for i:=1 to m do begin readln(x,y,t); for j:=1 to 5 do if a[x+dx[j],y+dy[j]]t then a[x+dx[j],y+dy[j]]:=t; end; head:=0;tail:=1; while headtail do begin head:=(head+1) mod 10000; for i:=1 to 5 do begin xi:=q[head,1]+dx[i]; yi:=q[head,2]+dy[i]; time:=q[head,0]+1; if (xi=0)and(xi=301)and(yi=0)and(yi=301)and(a[xi,yi]time)then begin if a[xi,yi]=maxlongint then begin writeln(time); close(input); close(output); halt; end; tail:=(tail+1) mod 10000; q[tail,0]:=time; q[tail,1]:=xi; q[tail,2]:=yi; a[xi,yi]:=0; end; end; end; writeln(-1); close(input); close(output); end. 宽搜的优化之一:双向搜索 使用广度优先搜索时,离根结点最近的结点先扩展,所以广度优先搜索法比较适合求步数最少的解,因为广度优先要保留所有搜索过的节点,随着搜索程度的加深,所需的存储空间成指数增加。因此在必要时我们采用双向搜索来减少搜索空间和存储空间,如下面的例子。 例 字串变换(NOIP2002tg) [问题描述]:已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ - B1$ A2$ - B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。例如:A$=abcd B$=xyz 变换规则为:‘abc’-‘xu’ ‘ud’-‘y’ ‘y’-‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:‘abcd’-‘xud’-‘xy’-‘xyz’ 共进行了三次变换,使得 A$ 变换为B$。 [输入]:输入文件名。文件格式如下: A$ B$ A1$ B1$ \ A2$ B2$? |- 变换规则 ... ... /? 所有字符串长度的上限为 20。 [输出]:输格式如下: 若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出NO ANSWER! [输入输出样例] b.in: abcd xyz abc xu ud y y yz B.out:3 算法分析:此题是求变换的最少步数,很显然可以使用广度优先搜索法,如果直接从初状态搜到目标状态,最坏情况下存储的结点数超过6的10次方幂,搜索空间过大,因此我们考虑使双向搜索,同时从初始状态和目标状态向中间状态搜索,当相遇时搜索结束。采用双向搜索,存储的结点数还有可能超限,我们在前向搜索队列中存储5步内变换的结点,在后向搜索队列中,由于第5步产生的结点只是用来与前向队列中的结点比较,所以可以不存储在队列中,后向搜索队列只需存储4步内的结点,这样就解决了存储空间问题。 为了使用方
文档评论(0)