HDU 1254 推箱子 (BFS套BFS)

推箱子

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7052    Accepted Submission(s): 2008

Problem Description
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.

现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.


Input
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.

Output
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.
 
Sample Input
 
   
1 5 5 0 3 0 0 0 1 0 1 4 0 0 0 1 0 0 1 0 2 0 0 0 0 0 0 0
 
Sample Output
 
   
4
 
Author
Ignatius.L & weigang Lee
 
Recommend
Ignatius.L   |   We have carefully selected several similar problems for you:  1372 1429 1728 1195 1401 

题意:给你一个图,问你能不能将箱子推到终点,(注意!!)求出最少需要推动箱子多少格才能帮箱子推到指定位置?推箱子时可以往回推,但要判断人能否到达推箱子的位置。
        BFS 套 BFS 撸一波。。。。

AC代码:
#include
#include
#include
#include
using namespace std;

struct node
{
    int x,y,step;
    int peox,peoy;
}a,b;

struct Node
{
    int x,y;
}p,q;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int map[10][10],n,m;
int mark[10][10][10][10];    
int judge_bfs(int starx,int stary,int endx,int endy,int tx,int ty) //判断人能否到达
{
    p.x=starx;
    p.y=stary;
    int leap[10][10];
    memset(leap,0,sizeof(leap));
    leap[p.x][p.y]=1;
    queueP;
    P.push(p);
    while(!P.empty())
    {
        q=P.front();
        P.pop();
        if(q.x==endx&&q.y==endy)
        return 1;
        for(int i=0;i<4;i++)
        {
            p.x=q.x+dir[i][0];
            p.y=q.y+dir[i][1];
            if(p.x<1||p.x>n||p.y<1||p.y>m) continue;
            if(p.x==tx&&p.y==ty) continue;
            if(leap[p.x][p.y]==0&&map[p.x][p.y]!=1)
            {
                leap[p.x][p.y]=1;
                P.push(p);
            }
        }
    }    
    return 0;
}
int bfs(int starx,int stary,int peox,int peoy) //搜箱子
{
    int i;
    a.x=starx;    
    a.y=stary;
    a.peox=peox;
    a.peoy=peoy;
    a.step=0;
    memset(mark,0,sizeof(mark));
    mark[a.x][a.y][a.peox][a.peoy]=1;
    queueQ;
    Q.push(a);
    while(!Q.empty())
    {
        b=Q.front();
        Q.pop();
        if(map[b.x][b.y]==3) //终点 
        {
            return b.step;
        }
        for(i=0;i<4;i++)
        {
            a.x=b.x+dir[i][0];
            a.y=b.y+dir[i][1];
            a.step=b.step+1;
            if(a.x<1||a.x>n||a.y<1||a.y>m) continue;
            if(map[a.x][a.y]==1) continue;
            if(mark[a.x][a.y][b.x][b.y]) continue;
            if(i==0)
            {
                if(b.y-1>=1&&map[b.x][b.y-1]!=1&&judge_bfs(b.peox,b.peoy,b.x,b.y-1,b.x,b.y))
                {
                    a.peox=b.x;
                    a.peoy=b.y;
                    mark[a.x][a.y][a.peox][a.peoy]=1;
                    Q.push(a);
                }
            }
            else if(i==1)
            {
                if(b.y+1<=m&&map[b.x][b.y+1]!=1&&judge_bfs(b.peox,b.peoy,b.x,b.y+1,b.x,b.y))
                {
                    a.peox=b.x;
                    a.peoy=b.y;
                    mark[a.x][a.y][a.peox][a.peoy]=1;
                    Q.push(a);
                }
            }
            else if(i==2)
            {
                if(b.x-1>=1&&map[b.x-1][b.y]!=1&&judge_bfs(b.peox,b.peoy,b.x-1,b.y,b.x,b.y))
                {
                    a.peox=b.x;
                    a.peoy=b.y;
                    mark[a.x][a.y][a.peox][a.peoy]=1;
                    Q.push(a);
                }
            }
            else
            {
                if(b.x+1<=n&&map[b.x+1][b.y]!=1&&judge_bfs(b.peox,b.peoy,b.x+1,b.y,b.x,b.y))
                {
                    a.peox=b.x;
                    a.peoy=b.y;
                    mark[a.x][a.y][a.peox][a.peoy]=1;
                    Q.push(a);
                }
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,T,starx,stary,peox,peoy;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
         for(j=1;j<=m;j++)
        {
            scanf("%d",&map[i][j]);
            if(map[i][j]==2)  //箱子的起点 
            {
                starx=i;
                stary=j;
            }
            if(map[i][j]==4)  //人的位置 
            {
                peox=i;
                peoy=j;
            }
        }
        int ans=bfs(starx,stary,peox,peoy);    
        if(!ans) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(HDUOJ,ACM_搜索)