数据结构第三版李春葆第3章栈和队列.pptVIP

数据结构第三版李春葆第3章栈和队列.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构第三版李春葆第3章栈和队列.ppt

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 (i-1,j)方位0 (i,j+1)方位2 (i+1,j)方位1 (i,j-1)方位3 所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 (i,j) 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图3.6所示的迷宫,对应的迷宫数组mg如下: int mg[M+2][N+2]={ //M=8,N=8 {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}}; 算法设计 对于迷宫中的每个方块,有上下左右四个方块相邻,如图3.4所示,第i行第j列的当前方块的位置为(i,j),规定上方方块为方位0,顺时针方向递增编号。在试探过程中,假设从方位0到方位3的方向查找下一个可走的方块。 为了便于回溯,对于可走的方块都要进栈,并试探它的下一可走的方位,将这个可走的方位保存到栈中,为此,将栈定义为: struct { int i; //当前方块的行号 int j; //当前方块的列号 int di; //di是下一可走方位的方位号 } Stack[MaxSize]; //定义栈 int top=-1; //初始化栈指针 求解迷宫(1,1)到(M-2,N-2)路径的过程是:先将入口进栈(初始方位设置为-1),在栈不空时循环:取栈顶方块(不退栈),若该方块是出口,则输出栈中方块即为路径。否则,找下一个可走的相邻方块,若不存在这样的方块,则退栈。若存在这样的方块,则将其方位保存到栈顶元素中,并将这个可走的相邻方块进栈(初始方位设置为-1)。 为了保证试探的可走相邻方块不是已走路径上的方块,如(i,j)已进栈,在试探(i+1,j)的下一可走方块时,又试探到(i,j),这样可能会引起死循环,为此,在一个方块进栈后,将对应的mg数组元素值改为-1(变为不可走的相邻方块),当退栈时(表示没有可走相邻方块),将其恢复为0。 1 1 1 1 2 2 2 2 2 3 2 1 3 3 1 3 4 0 2 4 0    1 4 1 1 5 1 1 6 2 2 6 3 2 5 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 2 -1 2 5 -1 void mgpath() //路径为:(1,1)-(M-2,N-2) { int i,j,di,find,k; top++; //初始方块进栈 Stack[top].i=1;Stack[top].j=1; Stack[top].di=-1;mg[1][1]=-1; while (top-1) //栈不空时循环 { i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; if (i==M-2 j==N-2) //找到了出口,输出路径 { printf(迷宫路径如下:\n); for (k=0;k=top;k++) { printf(\t(%d,%d),Stack[k].i,Stack[k].j); if ((k+1)%5==0) printf(\n); } printf(\n); return; } find=0; while (di4 find==0) //找下一个可走方块 { di++; switch(di) { case 0:i=Stack[top].i-1;j=Stack[top].j;br

文档评论(0)

heroliuguan + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8073070133000003

1亿VIP精品文档

相关文档