推箱子

一、题目 : 推箱子
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
推箱子是一款经典游戏。如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点。





规定以下规则:


1、一局游戏中只会有一个箱子,一个玩家和一个目标点。


2、通过方向键控制玩家移动。


3、图中的灰色格子代表墙壁,玩家与箱子都不能通过。


4、推到墙壁的箱子,就无法再将箱子推离墙壁,因为玩家无法到达箱子靠墙壁的一侧去推箱子。也就是说箱子只能以“被推”的方式被移动,不是以“被拉”的方式被移动。但如果玩家将箱子推至墙壁后,垂直墙壁的两侧没有阻碍物,则玩家可以朝这两个不同的方向推移箱子。如果箱子进入角落,就没有办法再推动这个箱子了。


5、玩家是不能走出场景的。玩家推着箱子到达场景边缘,如果继续点击使玩家和箱子向墙壁前进的方向键,箱子和人都会保持不动。玩家的前进方向上如果有墙壁,也是不能前进的。但是这些点击都视为合理的输入。


6、箱子一旦到达目标点,就不能再移动了。但这时,玩家仍然可以在场景内自由行动。如果继续尝试推箱子,那么玩家将会和箱子一起保持在原地不动。


现在,给出一种方向键的点击方案,请判断,这种方案是否能使箱子最终停在目标点上。为了方便表示,我们以0代表空白格子,以4代表不能通过区域,以1代表玩家,以3代表箱子,以2代表目标点。


输入
第一行数据包含三个整数,N,M,S。其中,N(0 < N <= 100)代表格子的宽度,M(0 < M <= 100)代表格子的高度,S(0 < S <= 200)代表测试点的个数。


接下来的M行,每行都会有N个字符,描述当前的盘面。


接下来的S行,每行都代表一个测试点。每行都以一个整数T(0 < T <= 10000)开头,接下来是一个空格和T个字符。这T个字符仅由d,u,l,r这四个字母组成,分别代表了敲击向下,向上,向左,向右的方向键。


输出
对于每个测试点,输出最后箱子是否在目标点上。如果是,输出YES,如果不是,则输出NO。


样例输入
5 4 3
00000
13000
00200
00000
4 rurd
6 urdldr
6 rrrurd
样例输出
YES
YES

NO


二、个人解答

       上面的是网易游戏实习招聘的一道题,自己看到了,做了一下,现贴出自己写的代码,有什么问题,还请大家指出改正。

#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <numeric>
#include <map>
#include <vector>
#include <deque>
#include <queue>
#include <string>
#include <stack>
#include <exception>
#include <math.h>
#include <cctype>
#include <stdio.h>
#include <list>

using namespace std;

bool reachDest(vector<string> &tmp,int &t,string &op)
{
	int curPosX,curPosY,i,j;
	int m=tmp.size(),n=tmp[0].size();
	//cout<<m<<"--"<<n<<endl;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
		{
			if(tmp[i][j]=='1')
			{
				curPosX=i;
				curPosY=j;
				i=m;
				break;
			}

		}
	//cout<<curPosX<<"=="<<curPosY<<endl;
	//
	for(i=0;i<t;i++)
	{
		switch(op[i])
		{
		case 'd':
			if(curPosX+1<n&&tmp[curPosX+1][curPosY]!='4')
			{
				if(tmp[curPosX+1][curPosY]=='3')
				{
					if(curPosX+2<m&&tmp[curPosX+2][curPosY]!='4')
					{
						if(tmp[curPosX+2][curPosY]=='2')
							return true;
						else
						{
							tmp[curPosX+2][curPosY]='3';
							tmp[curPosX+1][curPosY]='1';
							tmp[curPosX][curPosY]='0';
							curPosX++;
						}
					}
					else
						continue;
				}
				else
				{
					tmp[curPosX+1][curPosY]='1';
					tmp[curPosX][curPosY]='0';
					curPosX++;
				}
			}
			else
				continue;
			break;
		case 'u':
			if(curPosX-1>=0&&tmp[curPosX-1][curPosY]!='4')
			{
				if(tmp[curPosX-1][curPosY]=='3')
				{
					if(curPosX-2>=0&&tmp[curPosX-2][curPosY]!='4')
					{
						if(tmp[curPosX-2][curPosY]=='2')
							return true;
						else
						{
							tmp[curPosX-2][curPosY]='3';
							tmp[curPosX-1][curPosY]='1';
							tmp[curPosX][curPosY]='0';
							curPosX--;
						}
					}
					else
						continue;
				}
				else
				{
					tmp[curPosX-1][curPosY]='1';
					tmp[curPosX][curPosY]='0';
					curPosX--;
				}
			}
			else
				continue;
			break;
		case 'l':
			if(curPosY-1>=0&&tmp[curPosX][curPosY-1]!='4')
			{
				if(tmp[curPosX][curPosY-1]=='3')
				{
					if(curPosY-2>=0&&tmp[curPosX][curPosY-2]!='4')
					{
						if(tmp[curPosX][curPosY-2]=='2')
							return true;
						else
						{
							tmp[curPosX][curPosY-2]='3';
							tmp[curPosX][curPosY-1]='1';
							tmp[curPosX][curPosY]='0';
							curPosY--;
						}
					}
					else
						continue;
				}
				else
				{
					tmp[curPosX][curPosY-1]='1';
					tmp[curPosX][curPosY]='0';
					curPosY--;
				}
			}
			else
				continue;
			break;
		case 'r':
			if(curPosY+1<n&&tmp[curPosX][curPosY+1]!='4')
			{
				if(tmp[curPosX][curPosY+1]=='3')
				{
					if(curPosY+1<n&&tmp[curPosX][curPosY+2]!='4')
					{
						if(tmp[curPosX][curPosY+2]=='2')
							return true;
						else
						{
							tmp[curPosX][curPosY+2]='3';
							tmp[curPosX][curPosY+1]='1';
							tmp[curPosX][curPosY]='0';
							curPosY++;
						}
					}
					else
						continue;
				}
				else
				{
					tmp[curPosX][curPosY+1]='1';
					tmp[curPosX][curPosY]='0';
					curPosY++;
				}
			}
			else
				continue;

			break;
		}
	}

	return false;
}

int main()
{
	int m,n,s,i,j,t;
	cin>>m>>n>>s;
	vector<string> maxtrix,tmp;
	string str,op;
	for(i=0;i<n;i++)
	{
		cin>>str;
		maxtrix.push_back(str);
	}
	for(i=0;i<s;i++)
	{
		cin>>t>>op;
		tmp.assign(maxtrix.begin(),maxtrix.end());
		if(reachDest(tmp,t,op))
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}

	//system("pause");
	return 0;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
´问题描述: 码头仓库是划分为n×m个格子的矩形阵列。有公共边的格子是相邻格子。当前仓库中 有的格子是空闲的;有的格子则已经堆放了沉重的货物。由于堆放的货物很重,单凭仓库管 理员的力量是无法移动的。仓库管理员有一项任务,要将一个小箱子到指定的格子上去。 管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。管理员站在与箱子相对的空 闲格子上时,可以做一次动,把箱子到另一相邻的空闲格子。箱时只能向管理员的对 面方向。由于要动的箱子很重,仓库管理员想尽量减少箱子的次数。 ´编程任务: 对于给定的仓库布局,以及仓库管理员在仓库中的位置和箱子的开始位置和目标位置, 设计一个解箱子问题的分支限界法, 计算出仓库管理员将箱子从开始位置到目标位置所 需的最少动次数。 ´数据输入: 由文件input.txt提供输入数据。输入文件第 1 行有 2个正整数 n和 m(1<=n,m<=100) , 表示仓库是n×m个格子的矩形阵列。接下来有 n行,每行有 m个字符,表示格子的状态。 S 表示格子上放了不可移动的沉重货物; w 表示格子空闲; M 表示仓库管理员的初始位置; P 表示箱子的初始位置; K 表示箱子的目标位置。 ´结果输出: 将计算出的最少动次数输出到文件 output.txt。如果仓库管理员无法将箱子从开始位 置到目标位置则输出“No solution!” 。 输入文件示例 输出文件示例 input.txt output.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值