



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用栈实现迷宫的求解一、要解决的四个问题:1、表示迷宫的数据结构:设迷宫为m行n列,利用mazemn来表示一个迷宫,mazeij=0或1; 其中:0表示通路,1表示不通,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化我们用mazem+2n+2来表示迷宫,而迷宫的四周的值全部为1。这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。如图3.4表示的迷宫是一个68的迷宫。入口坐标为(1,1),出口坐标为(m,n)。入口(1,1) 012345678n90111111111111011101111210010111113100000001141001101111511000100016101100010171111111111m 出口 (6,8) 图1 用mazem+2n+2表示的迷宫迷宫的定义如下:#define m 6 /* 迷宫的实际行 */#define n 8 /* 迷宫的实际列 */int maze m+2n+2 ;2 、试探方向:在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x , y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图2所示。因为出口在(m,n),因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便的求出新点的坐标,将从正东开始沿顺时针进行的这4个方向(用0,1,2,3表示东、南、西、北)的坐标增量放在一个结构数组move 4 中,在move 数组中,每个元素有两个域组成,x:横坐标增量,y:纵坐标增量。Move数组如图3所示。move数组定义如下:typedef struct int x ; /行int y ; /列 item ; item move4 ;这样对move的设计会很方便地求出从某点 (x,y) 按某一方向 v (0v3) 到达的新点(i,j)的坐标:i =x + movev.x ,j = y + movev.y 。(x,y)图2 与点(x,y)相邻的4个点及坐标(x,y+1)(x,y-1)(x+1,y)(x-1,y)xy00111020-13-10图3 增量数组move3栈的设计:当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向,即每走一步栈中记下的内容为(行,列,来的方向)。对于图1所示迷宫,依次入栈为:top 3,4,0 3,3,0 3,2,1 2,2,0 2,1,1 1,1,0栈中每一组数据是所到达的每点的坐标及从该点沿哪个方向向下走的,对于图3迷宫,走的路线为:(1,1)0(2,1)1(2,2)0(3,2)1(3,3)0(3,4)0(下脚标表示方向),当无路可走,则应回溯,对应的操作是出栈,沿下一个方向即方向继续试探。栈中元素是一个由行、列、方向组成的三元组,栈元素的设计如下:typedef structint x , y , d ;/* 横纵坐标及方向*/datatype ;栈的定义为: SeqStack s ;4. 如何防止重复到达某点,以避免发生死循环:一种方法是另外设置一个标志数组markmn,它的所有元素都初始化为0,一旦到达了某一点 ( i , j )之后,使mark i j 置1,下次再试探这个位置时就不能再走了。另一种方法是当到达某点(i , j)后使maze i j 置 -1,以便区别未到达过的点,同样也能起到防止走重复点的目的,此处采用后一方法,算法结束前可恢复原迷宫。二、迷宫求解算法思想如下:(1) 栈初始化;(2) 将入口点坐标及到达该点的方向(设为-1)入栈(3) while (栈不空) 栈顶元素(x , y , d)出栈 ;求出下一个要试探的方向d+ ; while (还有剩余试探方向时) if (d方向可走)则 (x , y , d)入栈 ; 求新点坐标 (i, j ) ;将新点(i , j)切换为当前点(x , y) ; if ( (x ,)= =(,n) ) 结束 ; else 重置 d=0 ; else d+ ; 算法如下: int path(int &maze,int m, int n, int move) /m,n为 maze的一、二维长度,move为结构体数组存放了试探的4个方向坐标 SeqStack s ; datetype temp ; int x, y, d, i, j ; temp.x=1 ; temp.y=1 ; temp.d=-1 ; Push_SeqStack (s,temp) ;阿 while (! Empty_SeqStack (s ) ) Pop_SeqStack (s,temp) ;x=temp.x ; y=temp.y ; d=temp.d+1 ;while (d4) i=x+moved.x ; j=y+moved.y ;if ( mazeij= =0 ) temp=x, y, d ;Push_SeqStack ( s, temp ) ;x=i ; y=j ; mazexy= -1 ;if (x= =m&y= =n) return 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年呼吸内科呼吸系统疾病筛查考试答案及解析
- 民族团结创建课件
- 2025年皮肤科疾病诊断与治疗学习问答答案及解析
- 2025年康复理疗技术操作评估答案及解析
- 民族内涵课件
- 2025年肿瘤科学病理解读讨论答案及解析
- 2025年麻醉学临床技能操作模拟考试答案及解析
- 2025年消化内科病例分析训练总结卷答案及解析
- 2025年危重病房监护常规操作考核答案及解析
- 变间隙密封液压缸:间隙精准测量与唇边疲劳寿命的深度剖析
- 急性脑梗死静脉溶栓护理查房
- 2024年中国农业银行秋季校园招聘考试真题及答案
- 乡村医生药品管理培训
- 医院培训课件:《危重病人心电监测》
- 医院规培合同范本
- 银行贷款电子合同电子版(2025年版)
- 非物质文化遗产微短剧叙事策略与文化传承路径研究
- 胫腓骨骨折内固定术手术配合
- 隔物灸技术课件完整版
- 标本的安全运送
- 2025版员工试用期延长协议书
评论
0/150
提交评论