HDU 4213-Sokoban

来源:互联网 发布:青云志网游全套源码 编辑:程序博客网 时间:2024/05/21 21:45

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4213

题意:

推箱子游戏

给你一张地图,按照指令是否能够将箱子都推到目标地点

思路:

直接模拟就好了。

不过,要注意一些地方:

(1)注意'B'和'b','W'和'w'的区别,例如下面的这组测试数据:


输出:


(2)若是执行到某一段指令时,已经将将箱子全部送到目标地点,后面的指令就不再执行了

例如这组测试数据:


输出:


#include<cstdio>#include<cstring>#define maxn 20char 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;elsemap[i][k]='+';}printf("%c",map[i][k]);}printf("\n");}    }return 0;}

原创粉丝点击