【洛谷】P1126 - 机器人搬重物 (BFS + 大模拟)

题目链接

这道题,恶心了我一下午,历时四个小时,总算是写完了。

恶心之处就在于判断机器人的体积碰撞。
另外初始机器人竟然可能在砖块上??
还有就是,必需是机器人的左上角和终点重合。

AC代码:

#include <bits/stdc++.h>
using namespace std;
void solve();
int main(int argc, char const *argv[])
{
    solve();
    return 0;
}

/******************************************************************************/

int n,m,sx,sy,ex,ey;
char ch;
int mp[55][55];
bool vis[55][55][5];
struct node{
    int x,y;
    int step;
    int dir;
}p,q;
bool judge(int x,int y){
    if(x>0 && x<=n && y>0 && y<=m && mp[x][y] == 0) return 1;
    return 0;
}
bool check(int x,int y,int d,int dir){
    if(!(judge(x,y) && judge(x+1,y+1) && judge(x+1,y) && judge(x,y+1))) return 0;
    if(dir == 0){
        switch(d){
            case 3: if(!(judge(x-3,y) && judge(x-3,y+1)))   return 0;
            case 2: if(!(judge(x-2,y) && judge(x-2,y+1)))   return 0;
            case 1: if(!(judge(x-1,y) && judge(x-1,y+1)))   return 0;
        }
        return 1;
    }else if(dir == 1){
        switch(d){
            case 3: if(!(judge(x,y+4) && judge(x+1,y+4)))   return 0;
            case 2: if(!(judge(x,y+3) && judge(x+1,y+3)))   return 0;
            case 1: if(!(judge(x,y+2) && judge(x+1,y+2)))   return 0;
        }
        return 1;
    }else if(dir == 2){
        switch(d){
            case 3: if(!(judge(x+4,y) && judge(x+4,y+1)))   return 0;
            case 2: if(!(judge(x+3,y) && judge(x+3,y+1)))   return 0;
            case 1: if(!(judge(x+2,y) && judge(x+2,y+1)))   return 0;
        }
        return 1;
    }else if(dir == 3){
        switch(d){
            case 3: if(!(judge(x,y-3) && judge(x+1,y-3)))   return 0;
            case 2: if(!(judge(x,y-2) && judge(x+1,y-2)))   return 0;
            case 1: if(!(judge(x,y-1) && judge(x+1,y-1)))   return 0;
        }
        return 1;
    }
    return 1;
}
void bfs(){
    int x = sx,y=  sy;
    queue<node> que;
    q.x = x;q.y = y;q.step = 0;
    if(ch == 'N')   q.dir = 0;      // ok
    if(ch == 'E')   q.dir = 1;
    if(ch == 'S')   q.dir = 2;
    if(ch == 'W')   q.dir = 3;
    que.push(q);
    int ans = -1;
    while(!que.empty()){
        p = que.front();
        que.pop();
        if(vis[p.x][p.y][p.dir])    continue;
        vis[p.x][p.y][p.dir] = 1;
        // printf("%d %d %d %d\n",p.x,p.y,p.dir,p.step);
        if(p.x == ex && p.y == ey){
            ans = p.step;
            break;
        }
        q.step = p.step + 1;
        for(int i=1;i<=3;++i){          //Creep or walk or run
            if(check(p.x,p.y,i,p.dir)){
                if(p.dir == 0){
                    q.x = p.x - i;
                    q.y = p.y;
                    q.dir = p.dir;
                    que.push(q);
                }else if(p.dir == 1){
                    q.x = p.x;
                    q.y = p.y + i;
                    q.dir = p.dir;
                    que.push(q);
                }else if(p.dir == 2){
                    q.x = p.x + i;
                    q.y = p.y;
                    q.dir = p.dir;
                    que.push(q);
                }else if(p.dir == 3){
                    q.x = p.x;
                    q.y = p.y - i;
                    q.dir = p.dir;
                    que.push(q);
                }
            }
        }
        q.x = p.x;q.y = p.y;q.dir = (p.dir-1 + 4)%4;que.push(q);
        q.x = p.x;q.y = p.y;q.dir = (p.dir+1 + 4)%4;que.push(q);
    }
    printf("%d\n",ans);
}
void solve(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)   scanf("%d",&mp[i][j]);
    scanf("%d %d %d %d %c",&sx,&sy,&ex,&ey,&ch);
    if(mp[ex][ey] == 1) puts("-1");
    else if(mp[sx][sy] == 1 || mp[sx+1][sy] == 1 || mp[sx][sy+1] == 1 || mp[sx+1][sy+1] == 1)   puts("-1");
    else    bfs();
}

猜你喜欢

转载自blog.csdn.net/qq_41009682/article/details/82260413
今日推荐