- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 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;
                您可能关注的文档
最近下载
- EHS体系程序文件-信息沟通、协商和决议管理程序.docx VIP
 - 高中政治课堂教学应用时事政治策略探究.doc VIP
 - (GBT7588 1—2020)电梯制造与安装安全规范.pdf VIP
 - 设施农业智能化与现代农业装备产业发展趋势报告.docx
 - “十四五”公路养护发展规划.docx VIP
 - 健康评估(第二版)全套教学课件.pptx
 - 标准图集-20S515-钢筋混凝土及砖砌排水检查井.pdf VIP
 - 2024年贵州省六盘水市中考语文试卷真题(含答案逐题解析).docx
 - CQI-27铸造系统评估表 第二版(2023).xls VIP
 - 银行大堂服务实训(第2版) 课件 项目4 营业中引导营销服务.pdf VIP
 
原创力文档
                        

文档评论(0)