题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4213
题意:
推箱子游戏
给你一张地图,按照指令是否能够将箱子都推到目标地点
思路:
直接模拟就好了。
不过,要注意一些地方:
(1)注意'B'和'b','W'和'w'的区别,例如下面的这组测试数据:
输出:
(2)若是执行到某一段指令时,已经将将箱子全部送到目标地点,后面的指令就不再执行了
例如这组测试数据:
输出:
#include<cstdio>
#include<cstring>
#define maxn 20
char map[maxn][maxn];
bool aim[maxn][maxn];//箱子要推到的地方
bool complete;//能否完成任务
int dirx[4]={-1,1,0,0},diry[4]={0,0,-1,1};//上下左右
int startx,starty;//起点
int n,m;//地图的长和宽
void run(char *s)
{
for(;*s;s++)
{
//确定此时所走的方向
int dir;
if(*s=='U') dir=0;
else if(*s=='D') dir=1;
else if(*s=='L') dir=2;
else dir=3;
int tx=startx+dirx[dir],ty=starty+diry[dir];//下一步要走的地方
if(map[tx][ty]!='#')
{
int nextx=tx+dirx[dir],nexty=ty+diry[dir];
bool flag=false;
//如果推的是箱子,那么,箱子后面就不能是箱子也不能是墙
if(map[tx][ty]=='b'&&map[nextx][nexty]!='b'&&map[nextx][nexty]!='#')
{
map[tx][ty]='w';
map[nextx][nexty]='b';
map[startx][starty]='.';
startx=tx,starty=ty;
flag=true;
}
else if(map[tx][ty]=='.'||map[tx][ty]=='+')
{
map[tx][ty]='w';
map[startx][starty]='.';
startx=tx,starty=ty;
}
if(flag)
{
int t1=0,t2=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(aim[i][j])
{
t1++;
if(map[i][j]=='b')
t2++;
}
}
if(t1==t2)//已经成功把所有的箱子都推到目标
{
complete=true;
return;
}
}
}
}
}
int main()
{
int cas=1;
while(scanf("%d %d",&n,&m),n||m)
{
int i,k;
complete=false;
for(i=0;i<n;i++)
for(k=0;k<m;k++)
{
scanf(" %c",&map[i][k]);//不要写成scanf("%c",&map[i][k]);
aim[i][k]=false;
if(map[i][k]=='+'||map[i][k]=='B'||map[i][k]=='W')//这里最坑爹,要考虑到人在目标地点和箱子在目标地点的情况
{
aim[i][k]=true;
if(map[i][k]!='+')
map[i][k]+=32;
}
if(map[i][k]=='w')
startx=i,starty=k;
}
char str[100];
scanf("%s",str);
run(str);
printf("Game %d: ",cas++);
puts(complete?"complete":"incomplete");
for(i=0;i<n;i++)
{
for(k=0;k<m;k++)
{
if(aim[i][k])
{
if(map[i][k]=='b'||map[i][k]=='w')
map[i][k]-=32;
else
map[i][k]='+';
}
printf("%c",map[i][k]);
}
printf("\n");
}
}
return 0;
}