C - Push!!

Mr. Schwarz was a famous powerful pro wrestler. He starts a part time job as a warehouseman. His task is to move a cargo to a goal by repeatedly pushing the cargo in the warehouse, of course, without breaking the walls and the pillars of the warehouse.
There may be some pillars in the warehouse. Except for the locations of the pillars, the floor of the warehouse is paved with square tiles whose size fits with the cargo. Each pillar occupies the same area as a tile.
这里写图片描述
Initially, the cargo is on the center of a tile. With one push, he can move the cargo onto the center of an adjacent tile if he is in proper position. The tile onto which he will move the cargo must be one of (at most) four tiles (i.e., east, west, north or south) adjacent to the tile where the cargo is present.
To push, he must also be on the tile adjacent to the present tile. He can only push the cargo in the same direction as he faces to it and he cannot pull it. So, when the cargo is on the tile next to a wall (or a pillar), he can only move it along the wall (or the pillar). Furthermore, once he places it on a corner tile, he cannot move it anymore.
He can change his position, if there is a path to the position without obstacles (such as the cargo and pillars) in the way. The goal is not an obstacle. In addition, he can move only in the four directions (i.e., east, west, north or south) and change his direction only at the center of a tile.
As he is not so young, he wants to save his energy by keeping the number of required pushes as small as possible. But he does not mind the count of his pedometer, because walking is very light exercise for him.
Your job is to write a program that outputs the minimum number of pushes required to move the cargo to the goal, if ever possible.
Input
The input consists of multiple maps, each representing the size and the arrangement of the warehouse. A map is given in the following format.

w h
d11 d12 d13 … d1w
d21 d22 d23 … d2w

dh1 dh2 dh3 … dhw

The integers w and h are the lengths of the two sides of the floor of the warehouse in terms of widths of floor tiles. w and h are less than or equal to 7. The integer dij represents what is initially on the corresponding floor area in the following way.
0:
nothing (simply a floor tile)
1:
pillar
2:
the cargo
3:
the goal
4:
the warehouseman (Mr. Schwarz)
Each of the integers 2, 3 and 4 appears exactly once as dij in the map. Integer numbers in an input line are separated by at least one space character. The end of the input is indicated by a line containing two zeros.
Output
For each map, your program should output a line containing the minimum number of pushes. If the cargo cannot be moved to the goal, `-1’ should be output instead.
Sample Input
5 5
0 0 0 0 0
4 2 0 1 1
0 1 0 0 0
1 0 0 0 3
1 0 0 0 0
5 3
4 0 0 0 0
2 0 0 0 0
0 0 0 0 3
7 5
1 1 4 1 0 0 0
1 1 2 1 0 0 0
3 0 0 0 0 0 0
0 1 0 1 0 0 0
0 0 0 1 0 0 0
6 6
0 0 0 0 0 3
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 2 0 0 0 0
4 0 0 0 0 0
0 0
Sample Output
5
-1
11
8

题意:求箱子到达终点的最少步数。

bfs求解,枚举人的状态从而推出箱子的状态。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int vis[8][8][8][8];
int map[8][8];
int m,n;
struct node
{
    int xp,yp,xb,yb;
    int step;
}cur,tmp,gg;

int jud(int x1,int y1)
{
    if(x1>=n||y1>=m||x1<0||y1<0) return 0;

    return 1;
}
int bfs()
{
    queue <node> que;
    que.push(gg);

    int ans=0x3f3f3f3f;

    while(!que.empty())
    {
        tmp=que.front();
        que.pop();

        if(map[tmp.xb][tmp.yb]==3)
        {
            ans=min(ans,tmp.step);
            //箱子被移到终点
        }

        for(int i=0;i<4;i++)
        {
            //枚举人
            cur.xp=tmp.xp+dx[i];
            cur.yp=tmp.yp+dy[i];
            //当前没走过或者当前步数比过往步数少并且是可走的
            if( (vis[cur.xp][cur.yp][tmp.xb][tmp.yb]==-1 || tmp.step<vis[cur.xp][cur.yp][tmp.xb][tmp.yb]) && map[cur.xp][cur.yp]!=1 && jud(cur.xp,cur.yp) )
            {
                if(cur.xp==tmp.xb&&cur.yp==tmp.yb)
                {
                    //当人是箱子的上一状态
                    cur.xb=cur.xp+dx[i];
                    cur.yb=cur.yp+dy[i];
                    if(jud(cur.xb,cur.yb))//箱子可移
                    {
                        cur.step=tmp.step+1;
                        vis[cur.xp][cur.yp][cur.xb][cur.yb]=cur.step;
                        que.push(cur);
                    }
                }

                if(!(cur.xp==tmp.xb&&cur.yp==tmp.yb))
                {
                    //当人不是箱子的上一状态
                    //箱子保持原状态
                    cur.xb=tmp.xb;
                    cur.yb=tmp.yb;
                    cur.step=tmp.step;
                    vis[cur.xp][cur.yp][cur.xb][cur.yb]=cur.step;
                    que.push(cur);
                }
            }
        }
    }

    if(ans==0x3f3f3f3f)
        return -1;
    else
        return ans;

}
int main (void)
{
    while(~scanf("%d %d",&m,&n))
    {
        memset(vis,-1,sizeof(vis));
        if(m==0&&n==0)
            break;

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                scanf("%d",&map[i][j]);
                if(map[i][j]==4)
                {
                    gg.xp=i;
                    gg.yp=j;
                    map[i][j]=0;
                }
                if(map[i][j]==2)
                {
                    gg.xb=i;
                    gg.yb=j;
                    map[i][j]=0;
                }
            }
        }

        gg.step=0;
        vis[gg.xp][gg.yp][gg.xb][gg.yb]=0;

        int ans=bfs();
        printf("%d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERROR Failed to compile with 48 errors 上午10:53:54 These dependencies were not found: * core-js/modules/es.array.push.js in ./node_modules/.store/@[email protected]/node_modules/@babel/runtime/helpers/esm/objectSpread2.js, ./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/.store/[email protected]/node_modules/babel-loader/lib!./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/.store/[email protected]/node_modules/vue-loader/lib??vue-loader-options!./src/components/HeaderSearch/index.vue?vue&type=script&lang=js& and 29 others * core-js/modules/es.error.cause.js in ./node_modules/.store/@[email protected]/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js, ./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/.store/[email protected]/node_modules/babel-loader/lib!./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/.store/[email protected]/node_modules/vue-loader/lib??vue-loader-options!./src/layout/components/Navbar.vue?vue&type=script&lang=js& and 5 others * core-js/modules/es.object.proto.js in ./node_modules/.store/@[email protected]/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js * core-js/modules/es.regexp.dot-all.js in ./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/.store/[email protected]/node_modules/babel-loader/lib!./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/.store/[email protected]/node_modules/vue-loader/lib??vue-loader-options!./src/components/ThemePicker/index.vue?vue&type=script&lang=js&, ./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/.store/[email protected]/node_modules/babel-loader/lib!./node_modules/.store/[email protected]/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/.store/[email protected]/node_modules/vue-loader/lib??vue-loader-options!./src/layout/components/Navbar.vue?vue&type=script&lang=js& and 2 others * core-js/modules/web.url-search-params.delete.js in ./src/utils/request.js * core-js/modules/web.url-search-params.has.js in ./src/utils/request.js * core-js/modules/web.url-search-params.size.js in ./src/utils/request.js * qs in ./src/utils/request.js * svg-baker-runtime/browser-symbol in ./src/icons/svg/user.svg To install them, you can run: npm install --save core-js/modules/es.array.push.js core-js/modules/es.error.cause.js core-js/modules/es.object.proto.js core-js/modules/es.regexp.dot-all.js core-js/modules/web.url-search-params.delete.js core-js/modules/web.url-search-params.has.js core-js/modules/web.url-search-params.size.js qs svg-baker-runtime/browser-symbol怎么解决如何安装
07-21

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值