- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)