算法试题之二.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4?求迷宫的路径 回溯算法的公式如下 K=l;x[k]=O while k0do x[k]=K [k]+l 输出k=k-l(回溯)k=kHx [k]=0鑒续探索)i*hile(zlkj=n LkJ) and (不満定要求) rf[k]=x 输出 k=k-l (回溯) k=kH x [k]=0 鑒续探索) ,用一个二维数组表示出迷宫问题 110 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 1 1 0 x,y 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 ,探索路径 TOC \o 1-5 \h \z 坐标 1: ( x+1, y+0) 坐标 2: (x+0, y+1) 坐标 3: (x-1, y+0) 坐标 4: (x+0, y-1 米取新数组(U, V)表示跳的坐标值: U:=X+a[j] j= 1,2,3 …,8 V:=Y+b[j] 此程序描述参考跳马。 例题: [记录走迷宫的路径问题描述 ]: 有一个m*n格的迷宫(m:表示行,n:表示列),其中有可走的也有不可走的,如果用 1表 示可以走, 0 表示不可以走,文件读入这 m*n 个数据的起始点,结束点(起始点和结束点都是用 两个数据来描述,分别表示这个点的行号和列号) 。现在要求你编程找出所有可行的通道,要求所 走的路中没有重复的点, 走时只能是上下左右四个方向。 如果一条路都不可行, 则输出相应的信息 (用 -1 表示走投无路)。 [输入]: 第一行是两个数m,n( 1m, n15),接下来是m行n列有1和0组成的数据,最后两行是起 始点和结束点。 [输出]: 所有可行的路径,描述一个点时可用( x,y )的形式,除开始点外,其他的都要用 ,-?表示方 向。 如果没有一条可行的路径,则使程序输出 -1。 [样例] maze.in 5 6 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 5 6 maze.out ,(1,1)-(2,1)-(2,2)-(2,3)-(2,4)-(2,5)-(3,5)-(3,4)-(3,3)-(4,3)-(4,4)-(4,5)-(5,5)- (5,6)? 分析: 用一个数组 a 来存放迷宫可走的情况,用另一个数组 b 来存放哪些点已经走过了。对于中间 某一个点( x,y) ,则它有可能有四个可走的方向,对应位置表示为: (x-1,y) ,(x,y+1) ,(x+1,y) , (x,y-1)。每个点都会有四个方向可走。如果没有走过(数组b相应点对应的值为0)且可以走(数 组a相应点的值为1)同时不越界,那么就走过去,判断一下有没有到达终点。如果到了终点,输 出所走的路径,否则继续走下去。 探索过程我们写成一个过程 try search procedure try(x,yb,p ); {x,y表示某一个点,b表示已经走过点的情况,p是已走过的路径} begin for i:=1 to 4 do { 分别对 4 个点进行探索 } begin (x,y)先记住当前点的位置,还要记住走过的情况和走过的路; 如果第i个点可以走(u,v),则走过去; 判断如果到终点,则输出所走的路径,且置有路可走的信息。 否则继续从新的点往下查找 try(x,y,b,p); End; End; 参考程序: var a,b:array[1..15,1..15] of 0..1; p:string; procedure try(x,y:integer;b:arr;p:string); var i,j,k,x1,y1:integer; b1:arr; p1:string; begin for i:= to 4 do begin for j:=1 to m do for k:=1 to n do b1[j,k]:=b[j,k]; p1:=p; x1:=x; y1:=y; {} case i of 1: if (y1) and (a[x,y-1]=1) and (b[x,y-1]=0) then y1:=y-1; 2: if (x1) and (a[x-1,y]=1) and (b[x-1,y]=0) then x1:=x-1; 3: if (yn) and (a[x,y+1]=1) and (b[x,y+1]=0) then y1:=y+1; 4: if (xm) and (a[x+1,y]=1) and (b[x+1,y]=0) then x1:=x+1; end; if (x1x) or (y1y) then begin b1[x1,y1]:=1;

文档评论(0)

youbika + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档