第3章 栈_队列.ppt

  1. 1、本文档共110页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
迷宫求解 通常用的是“穷举求解”的方法 # # # # # # # # # # # ? ˉ # $ $ $ # # # ˉ # $ $ $ # # # ˉ ? $ $ # # # # ˉ # # # # # # ? ? ˉ # # # # # ? ? ˉ # # # # # # # ˉ # # # # ? ? ? # # # # # # # # # # # # # # # # # 迷宫路径算法的基本思想 若当前位置“可通”,则纳入路径,继续前进; 若当前位置“不可通”,则后退,换方向继续探索; 若四周“均无通路”,则将当前位置从路径中删除出去。 设定当前位置的初值为入口位置; do{  若当前位置可通,  则{将当前位置插入栈顶;   若该位置是出口位置,则算法结束;   否则切换当前位置的右邻方块为新的  当前位置;    } ……….. 否则 { 若栈不空且栈顶位置尚有其他方向未被探索, 则设定新的当前位置为: 沿顺时针方向旋转 找到的栈顶位置的下一相邻块; 若栈不空但栈顶位置的四周均不可通, 则{ 删去栈顶位置;// 从路径中删去该通道块 若栈不空,则重新测试新的栈顶位置, 直至找到一个可通的相邻块或出栈至栈空; } } }while (栈不空); typedef struct { int ord; //序号 PosType seat; //坐标 int di; //方向 }SElemType; //栈元素 Status MazePath (MazeType maze, PosType start, PosType end) { InitStack(S); curpos=start; //当前位置 curstep=1;  do { if (Pass(curpos)) { //可通过且未走过 FootPrint(curpos); //记已通过标记 e=(curstep, curpos, 1); Push (S, e); if (curpos == end) return (TRUE); curpos = NextPos ( curpos, 1); curstep++; } else { if (!StackEmpty(S)) { Pop(S, e); while (e.di==4 !StackEmpty(S)) { MarkPrint(e.seat); Pop(S,e); //记不能通过标记 }//while if(e.di4) { e.di++; Push(S, e); curpos = NextPos(e.seat, e.di); } } } }while (!StackEmpty(S)); return (FALSE); } 5. 背包问题的求解 假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + … + wn=T,要求找出所有满足上述条件的解。 例如:当T=10,各件物品的体积 {1,8,4,3,5,2}时, 可找到下列4组解:(1,4,3,2) (1,4,5) (8,2) (3,5,2) 背包问题:试用非递归方法设计求解背包问题的算法。 算法思想:将n个物件顺序存入一数组w[0..n-1]中,依次选取物件试探存放,若放入物件后不超过背包的装载重量,则装入,否则选择下一物件再试,直至放入物件的重量之和等于total为止。如果装入某物件后被包未满,但又找不到合适的物件可装,说明已装入物件中又不恰当的,则取出最后放入的物件,继续用其他未装入的物件试装,如此反复直至背包装满,说明问题有解,或无合适物件可选说明问题无解。 参考答案: 非递归解法实现是要设一个栈S,当选取某物件i装入背包时,须计算背包尚能允

文档评论(0)

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

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

1亿VIP精品文档

相关文档