算法设计与分析开放性实验报告.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《推箱子问题的设计与实现》实验报告 一、问题描述 码头仓库是划分为n×m个格子的矩形阵列。有公共边的格子是相邻格子。当前仓库中 有的格子是空闲的;有的格子则已经堆放了沉重的货物。由于堆放的货物很重,单凭仓库管 理员的力量是无法移动的。仓库管理员有一项任务,要将一个小箱子推到指定的格子上去。 管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。管理员站在与箱子相对的空 闲格子上时,可以做一次推动,把箱子推到另一相邻的空闲格子。推箱时只能向管理员的对 面方向推。由于要推动的箱子很重,仓库管理员想尽量减少推箱子的次数。 二、问题求解分析 设箱子位置为Box,目标位置是End,人的位置为Man. 可从所述问题上得到以下条件: 1.箱子是事物,不能和人处于同一位置上 2.人只能推着箱子向前方移动 3.移动方向只有四种:上、下、左、右 4.找出从Box到Tar的最短路径,如果不存在任何路径,那么将相应的信息返回 5.可移动空间周围有堵墙,即移动空间是封闭的 6.走过的位置可重走 如图所示,设箱子要移动到位置A,并且要求路径最短,那么我们可以从需求出发设计算法。既然要到达A位置,那么箱子必然要先到达B,C,D,E中的一点,假设B,C,D,E均可行,则我们可以让箱子先到达B,将找出的箱子到A的路径信息,保存起来,然后恢复各种信息到初始状况,依次比较箱子到达C,D,E的各种路径,并找出其中最短的一条件作为函数的返回值,最终将最优的这条路径返回即可。 同时在寻找路径时,我们可以对有哪些信誉好的足球投注网站空间进行剪枝,经过分析,我们可以在以下情况下进行剪枝: 有哪些信誉好的足球投注网站到当前结点时,判断路径走不通 要添加到路径中的结点是堵物时 有哪些信誉好的足球投注网站出的可行路径比之前保留起来的可行路径较长 在这些特殊的情况下,我们可以实现剪枝,最大限度的节省内存空间和有哪些信誉好的足球投注网站空间。 对于特殊的情况,例如下图(2)所示,人站在C处,要求箱子从A移动到B。很明显,人是无法推动箱子的,因为根据题意,不存在人能够到达推动箱子的地方的路径,那么此时该怎样做呢? 经过分析,我们可以有如下解决方法: 求出箱子此次移动人必须站在的地方,此时为D。 采用局部向整体扩散的方法,找出所有可以的到达D的坐标并将其标记某一特定的符号 B B A C D E B C A E D B C A E D (1) (2) 三、源程序关键代码 #includefstream #includequeue using namespace std; struct Position { short row; short col; }; struct GirdS { short row; short col; int step; int totle; Position man_s; }; struct Compare { public: bool operator() (const GirdS x, const GirdS y) const { return x.totle y.totle; } }; ifstream in_f(input.txt); ofstream out_f(output.txt); int n, m; //定义有哪些信誉好的足球投注网站四个方向 Position offset[4]; //start:箱子的初始位置;end:箱子的目标位置;man_s:人的位置;人是在man_t把箱子往nbox_e位置推 Position start, end, man_s, man_t; //标志方格状态-1为障碍,0为空闲 short **menFlag ; //临时存放menFlag的数组 short **temp ; //标志方格的四个方向是否空闲 bool ***girdFlag; //box_s:箱子所在位置,nbox_e:推之后箱子的位置 GirdS box_s, nbox_e; //可扩展结点队列,经过大小排列的队列 ? priority_queue GirdS, vector GirdS , Compare Q; //人能否到达到man_t的位置,人是在man_t把箱子往nbox_e位置推 bool CanArrive(

文档评论(0)

134****4355 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档