- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用栈实现迷宫求解.doc
利用栈实现迷宫的求解 一、要解决的四个问题: 1、表示迷宫的数据结构: 设迷宫为m行n列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1; 其中:0表示通路,1表示不通,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化我们用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1。这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 如图3.4表示的迷宫是一个6×8的迷宫。入口坐标为(1,1),出口坐标为(m,n)。 入口(1,1) 0 1 2 3 4 5 6 7 8 9 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 2 1 0 0 1 0 1 1 1 1 1 3 1 0 0 0 0 0 0 0 1 1 4 1 0 0 1 1 0 1 1 1 1 5 1 1 0 0 0 1 0 0 0 1 6 1 0 1 1 0 0 0 1 0 1 7 1 1 1 1 1 1 1 1 1 1 出口 (6,8) 图1 用maze[m+2][n+2]表示的迷宫 迷宫的定义如下: #define m 6 /* 迷宫的实际行 */ #define n 8 /* 迷宫的实际列 */ int maze [m+2][n+2] ; 2 、试探方向: 在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x , y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图2所示。因为出口在(m,nmove [ 4 ]中,在move 数组中,每个元素有两个域组成,x:横坐标增量,y:纵坐标增量。Move数组如图3所示。 move数组定义如下: typedef struct { int x ; //行 int y ; //列 } item ; item move[4] ; 这样对move的设计会很方便地求出从某点 (x,y) 按某一方向 v (0≤v≤3) 到达的新点(i,j)的坐标:i =x + move[v].x ,j = y + move[v].y 。 x y 0 0 1 1 1 0 2 0 -1 3 -1 0 3.栈的设计: 当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向,即每走一步栈中记下的内容为(行,列,来的方向)。对于图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 struct{ int x , y , d ;/* 横纵坐标及方向*/ }datatype ; 栈的定义为: SeqStack s ; 4. 如何防止重复到达某点,以避免发生死循环: 一种方法是另外设置一个标志数组mark[m][n],它的所有元素都初始化为0,一旦到达了某一点 ( i , j )之后,使mark[ i ][ j ] 置1,下次再试探这个位置时就不能再走了。另一种方法是当到达某点(i , j)后使maze[ i ][ j ] 置 -1,以便区别未到达过的点,同样也能起到防止走重复点的目的,此处采用后一方法,算法结束前可恢复原迷宫。 二、迷宫求解算法思想如下: 栈初始化; 将入口点坐标及到达该点的方向(设为-1)入栈 while (栈不空) { 栈顶元素=>(x , y , d) 出栈 ; 求出下一个要试探的方向d++ ; while (还有剩余试探方向时) { if (d方向可走) 则 { (x , y , d)入栈 ; 求新点坐标 (i, j ) ; 将新点(i , j)切换为当前点(x , y) ; if ( (x ,y)= =(m,n) ) 结束 ; else 重置 d=0 ; } el
有哪些信誉好的足球投注网站
文档评论(0)