【The first】 题解:机器人搬重物

这是第一次写题解。。。
选的真的道题有坑。。。
请认真读题。
此题来自洛谷P1126

题目描述

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。!
样例

格式

输入格式

输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列!,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式

一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。

样例

INPUT

9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S

输出

12

题解

请认真读题。。被卡好长时间了。。
bfs 代码能力判断麻烦

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;

int n,m,i,j,x1,x2,y1,y2,k;
char dt;
int map[51][51][5];//1-n,2-s,3-e,4-w

struct loc{
    int x,y,time;
    char s;
};
loc Newloc(int x,int y,char s,int time){
    loc temp;
    temp.x=x;
    temp.y=y;
    temp.s=s;
    temp.time=time;
    return temp;
}

bool bfs();

int main(){
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            scanf("%d",&k);
            if(k){
                map[i][j][0]=map[i][j][1]=map[i][j][2]=map[i][j][3]=map[i][j][4]=2;
                map[i-1][j][0]=map[i-1][j][1]=map[i-1][j][2]=map[i-1][j][3]=map[i-1][j][4]=2;
                map[i-1][j-1][0]=map[i-1][j-1][1]=map[i-1][j-1][2]=map[i-1][j-1][3]=map[i-1][j-1][4]=2;
                map[i][j-1][0]=map[i][j-1][1]=map[i][j-1][2]=map[i][j-1][3]=map[i][j-1][4]=2;
            }
        }
    //for(i=1;i<=m;i++) map[1][i][0]=map[1][i][1]=map[1][i][2]=map[1][i][3]=map[1][i][4]=2;
    for(i=1;i<=m;i++) map[n][i][0]=map[n][i][1]=map[n][i][2]=map[n][i][3]=map[n][i][4]=2;
    //for(i=1;i<=n;i++) map[i][1][0]=map[i][1][1]=map[i][1][2]=map[i][1][3]=map[i][1][4]=2;
    for(i=1;i<=n;i++) map[i][m][0]=map[i][m][1]=map[i][m][2]=map[i][m][3]=map[i][m][4]=2;
    cin>>x1>>y1>>x2>>y2>>dt;
    if(!bfs())cout<<"-1";
    return 0;
}

bool bfs(){
    queue<loc>q;
    if(!map[x1][y1][0])
	    q.push(Newloc(x1,y1,dt,0));
    map[x1][y1][0]=1;
    switch(dt){
        case'N':
            map[x1][y1][1]=1;
            break;
        case'S':
            map[x1][y1][2]=1;
            break;
        case'E':
            map[x1][y1][3]=1;
            break;
        case'W':
            map[x1][y1][4]=1;
            break;
    }
    while(!q.empty()){
        loc now=q.front();
        q.pop();
        int a=now.x;
        int b=now.y;
        int t=now.time;
        if(a==x2&&b==y2){
            cout<<t;
            return true;
        }
        if(now.s=='N'){              
            if(!map[a-3][b][0]&&map[a-2][b][0]!=2&&map[a-1][b][0]!=2&&a-3>=1){
                q.push(Newloc(a-3,b,'N',t+1));
                map[a-3][b][0]=map[a-3][b][1]=1;
            }                           
            if(!map[a-2][b][0]&&map[a-1][b][0]!=2&&a-2>=1){
                q.push(Newloc(a-2,b,'N',t+1));
                map[a-2][b][0]=map[a-2][b][1]=1;
            }
            if(!map[a-1][b][0]&&a-1>=1){
                q.push(Newloc(a-1,b,'N',t+1));
                map[a-1][b][0]=map[a-1][b][1]=1;
            }
            if(!map[a][b][3]){
                q.push(Newloc(a,b,'E',t+1));
                map[a][b][3]=1;
            }
            if(!map[a][b][4]){
                q.push(Newloc(a,b,'W',t+1));
                map[a][b][4]=1;
            }            
        }
        if(now.s=='S'){
            if(!map[a+3][b][0]&&map[a+2][b][0]!=2&&map[a+1][b][0]!=2&&a+3<=n){
                q.push(Newloc(a+3,b,'S',t+1));
                map[a+3][b][0]=map[a+3][b][2]=1;
            }
            if(!map[a+2][b][0]&&map[a+1][b][0]!=2&&a+2<=n){
                q.push(Newloc(a+2,b,'S',t+1));
                map[a+2][b][0]=map[a+2][b][2]=1;
            }
            if(!map[a+1][b][0]&&a+1<=n){
                q.push(Newloc(a+1,b,'S',t+1));
                map[a+1][b][0]=map[a+1][b][2]=1;
            }
            if(!map[a][b][3]){ 
                q.push(Newloc(a,b,'E',t+1));
                map[a][b][3]=1;
            }
            if(!map[a][b][4]){
                q.push(Newloc(a,b,'W',t+1));
                map[a][b][4]=1;
            }
        }
        if(now.s=='W'){
            if(!map[a][b-3][0]&&map[a][b-2][0]!=2&&map[a][b-1][0]!=2&&b-3>=1){
                q.push(Newloc(a,b-3,'W',t+1));
                map[a][b-2][0]=map[a][b-3][4]=1;
            }
            if(!map[a][b-2][0]&&map[a][b-1][0]!=2&&b-2>=1){
                q.push(Newloc(a,b-2,'W',t+1));
                map[a][b-2][0]=map[a][b-2][4]=1;
            }
            if(!map[a][b-1][0]&&b-1>=1){
                q.push(Newloc(a,b-1,'W',t+1));
                map[a][b-1][0]=map[a][b-1][4]=1;
            }
            if(!map[a][b][1]){
                q.push(Newloc(a,b,'N',t+1));
                map[a][b][1]=1;
            }
            if(!map[a][b][2]){
                q.push(Newloc(a,b,'S',t+1));
                map[a][b][2]=1;
            }
        }
        if(now.s=='E'){
            if(!map[a][b+3][0]&&map[a][b+2][0]!=2&&map[a][b+1][0]!=2&&b+3<=n){
                q.push(Newloc(a,b+3,'E',t+1));
                map[a][b+3][0]=map[a][b+3][3]=1;
            }
            if(!map[a][b+2][0]&&map[a][b+1][0]!=2&&b+2<=n){
                q.push(Newloc(a,b+2,'E',t+1));
                map[a][b+2][0]=map[a][b+2][3]=1;
            }
            if(!map[a][b+1][0]&&b+1<=n){
                q.push(Newloc(a,b+1,'E',t+1));
                map[a][b+1][0]=map[a][b+1][3]=1;
            }
            if(!map[a][b][1]){
                q.push(Newloc(a,b,'N',t+1));
                map[a][b][1]=1;
            }
            if(!map[a][b][2]){
                q.push(Newloc(a,b,'S',t+1));
                map[a][b][2]=1;
            }
        }
    }
    return false;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值