[编程题] 推箱子

来源:互联网 发布:图灵程序设计丛书 java 编辑:程序博客网 时间:2024/05/16 17:39


[编程题] 推箱子

时间限制:1秒

空间限制:32768K

大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。 
输入描述:
每个测试输入包含1个测试用例第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。每个地图必定包含1个玩家、1个箱子、1个目的地。


输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。

输入例子1:
4 4......*@.....X..6 6...#........#*##....##.#..X....@#...

输出例子1:
311
思路:

第一眼看有点恶心。。之后想了下发现还是很简单,图很小,状压都用不到。直接维护人的位置和箱子位置

#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <queue>using namespace std;typedef long long ll;char mp[10][10];int vis[10][10][10][10];int data[4][2]={0,1,0,-1,1,0,-1,0};    int n,m;struct node{    int x,y,step;    int xx,yy;    node(int _x,int _y,int _step,int _xx,int _yy){x=_x,y=_y,step=_step,xx=_xx,yy=_yy;}};int bfs(int sxx,int syy,int sx,int sy){    queue<node> q;    q.push(node(sx,sy,0,sxx,syy));    while(!q.empty())    {        node s=q.front();        q.pop();        vis[s.x][s.y][s.xx][s.yy]=1;        //cout<<s.x <<" "<<s.y<<" "<<s.xx<<" "<<s.yy<<" "<<s.step<<endl;        if(mp[s.xx][s.yy]=='@') return s.step;        for(int i=0;i<4;i++){            node tmp=s;            tmp.step++;            tmp.x+=data[i][0];            tmp.y+=data[i][1];            if(tmp.x>n||tmp.y>m||tmp.x<1||tmp.y<1) continue;            if(mp[tmp.x][tmp.y]=='#') continue;            if(tmp.x==tmp.xx&&tmp.y==tmp.yy)                tmp.xx+=data[i][0],tmp.yy+=data[i][1];            if(tmp.xx>n||tmp.yy>m||tmp.xx<1||tmp.yy<1) continue;            if(mp[tmp.xx][tmp.yy]=='#') continue;            if(vis[tmp.x][tmp.y][tmp.xx][tmp.yy]!=1)                q.push(tmp);        }    }    return -1;}int main(){    cin>>n>>m;    for(int i=1;i<=n;i++)        cin>>&mp[i][1];    int sx,sy,xx,yy;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(mp[i][j]=='X')            sx=i,sy=j;            if(mp[i][j]=='*')            xx=i,yy=j;        }    }    cout<<bfs(xx,yy,sx,sy)<<endl;}/*3 3#.X#*.@..*/



原创粉丝点击