一、题目 : 推箱子
时间限制: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
时间限制: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;
}