編程題——推箱子

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/gxh27954/article/details/63252956

https://www.nowcoder.com/question/next?pid=4111169&qid=76262&tid=7218208



大家一定玩過“推箱子”這個經典的遊戲。具體規則就是在一個N*M的地圖上,有1個玩家、1個箱子、1個目的地以及若干障礙,其餘是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裏去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當然,箱子也不能被推出地圖或推到障礙裏。當箱子被推到目的地以後,遊戲目標達成。現在告訴你遊戲開始是初始的地圖佈局,請你求出玩家最少需要移動多少步才能夠將遊戲目標達成。 

輸入描述:
每個測試輸入包含1個測試用例
第一行輸入兩個數字N,M表示地圖的大小。其中0<N,M<=8。
接下來有N行,每行包含M個字符表示該行地圖。其中 . 表示空地、X表示玩家、*表示箱子、#表示障礙、@表示目的地。
每個地圖必定包含1個玩家、1個箱子、1個目的地。


輸出描述:
輸出一個數字表示玩家最少需要移動多少步才能將遊戲目標達成。當無論如何達成不了的時候,輸出-1。

輸入例子:
4 4
....
..*@
....
.X..
6 6
...#..
......
#*##..
..##.#
..X...
.@#...

輸出例子:
3
11


一看就是一個bfs的題,按着模版慢慢寫,然後發現不知道該怎麼處理最後到不了的情況。

靈光一現,只要再設置一個數組,記錄此時人的位置和箱子的位置,如果這個位置已經出現過了,則跳過~也就是我的f[10][10][10][10].



#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[10][10];
int px,py;
struct node{
    int x,y,cnt,sx,sy;
    bool friend operator < (node a,node b)
    {
        return a.cnt>b.cnt;
    }
};
int f[10][10][10][10];
node start;
int endx,endy;


int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
void bfs()
{
    priority_queue<node> q;
    node c;
    c.x=px;
    c.y=py;
    c.sx=start.x;
    c.sy=start.y;
    c.cnt=0;
    q.push(c);
    f[px][py][c.sx][c.sy]=1;
    int flag=0;
    while(!q.empty())
    {
        node d=q.top();
        q.pop();
        if(d.sx==endx&&d.sy==endy)
        {
            printf("%d\n",d.cnt);
            return ;
        }
        for(int i=0;i<4;i++)
        {
            c.x=d.x+xx[i];
            c.y=d.y+yy[i];
            c.cnt=d.cnt+1;
            if(s[c.x][c.y]=='#')
            {
                continue;
            }
            if(c.x==d.sx&&c.y==d.sy)
            {
                if(s[c.x+xx[i]][c.y+yy[i]]=='#')
                {
                    continue;
                }
                if(c.x+xx[i]>=0&&c.x+xx[i]<n&&c.y+yy[i]>=0&&c.y+yy[i]<m)
                {
                    c.sx=c.x+xx[i];
                    c.sy=c.y+yy[i];
                    if(f[c.x][c.y][c.sx][c.sy]==1)
                    {
                        continue;
                    }
                    f[c.x][c.y][c.sx][c.sy]=1;
                    q.push(c);
                }
            }
            else
            {
                if(c.x>=0&&c.x<n&&c.y>=0&&c.y<m)
                {
                    c.sx=d.sx;
                    c.sy=d.sy;
                    if(f[c.x][c.y][c.sx][c.sy]==1)
                    {
                        continue;
                    }
                    f[c.x][c.y][c.sx][c.sy]=1;
                    q.push(c);
                }
            }
        }
    }
    printf("-1\n");
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(f,0,sizeof(f));
    for(int i=0;i<n;i++)
    {
        scanf("%s",s[i]);
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='X')
            {
                px=i;
                py=j;
            }
            if(s[i][j]=='*')
            {
                start.x=i;
                start.y=j;
            }
            if(s[i][j]=='@')
            {
                endx=i;
                endy=j;
            }
        }
    }
    bfs();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章