P1126 机器人搬重物

来源:互联网 发布:day one windows 编辑:程序博客网 时间:2024/04/29 15:08

题目描述

机器人移动学会(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。

输入输出样例

输入样例#1:
9 100 0 0 0 0 0 1 0 0 00 0 0 0 0 0 0 0 1 00 0 0 1 0 0 0 0 0 00 0 1 0 0 0 0 0 0 00 0 0 0 0 0 1 0 0 00 0 0 0 0 1 0 0 0 00 0 0 1 1 0 0 0 0 00 0 0 0 0 0 0 0 0 01 0 0 0 0 0 0 0 1 07 2 2 7 S
输出样例#1:
12























#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;//障碍,最短路,长,宽,终点行列int map[55][55],d[55][55][4],n,m,tr,tc;char*dirs ="NESW";//顺时针int dr[]={-1,0,1,0};int dc[]={0,1,0,-1};struct node{int r,c,dir;};  //定义状态:行,列,方向node s;  //起点queue<node>Q;bool find(node u){if(u.r==tr&&u.c==tc)return true;return false;}  //到达终点bool ok(node u){int x=u.r,y=u.c;if(x<=0||x>=n||y<=0||y>=m||map[x][y])return false;return true;} //移动合法(注意不能移到墙壁旁)void bfs(){    memset(d,-1,sizeof(d));  //初始化    d[s.r][s.c][s.dir]=0;        if(find(s)){cout<<0;return;}  //特殊数据判断    Q.push(s);    while(!Q.empty())    {        node u=Q.front();Q.pop();  //待扩展结点        int x=u.r, y=u.c, z=u.dir;        node v;        v.r=x; v.c=y;      //right        v.dir=(z+1)%4;        if(d[v.r][v.c][v.dir]==-1){d[v.r][v.c][v.dir]=d[x][y][z]+1;Q.push(v);}      //left        v.dir=(z+3)%4;        if(d[v.r][v.c][v.dir]==-1){d[v.r][v.c][v.dir]=d[x][y][z]+1;Q.push(v);}        //one        v.r=x+dr[z]; v.c=y+dc[z]; v.dir=z;        if(ok(v)&&d[v.r][v.c][v.dir]==-1){d[v.r][v.c][v.dir]=d[x][y][z]+1;Q.push(v);if(find(v)){cout<<d[v.r][v.c][v.dir];return;}}        else if(!ok(v))continue; //剪枝      //two        v.r=x+2*dr[z]; v.c=y+2*dc[z]; v.dir=z;        if(ok(v)&&d[v.r][v.c][v.dir]==-1){d[v.r][v.c][v.dir]=d[x][y][z]+1;Q.push(v);if(find(v)){cout<<d[v.r][v.c][v.dir];return;}}          else if(!ok(v))continue;  //剪枝      //three        v.r=x+3*dr[z]; v.c=y+3*dc[z]; v.dir=z;        if(ok(v)&&d[v.r][v.c][v.dir]==-1){d[v.r][v.c][v.dir]=d[x][y][z]+1;Q.push(v);if(find(v)){cout<<d[v.r][v.c][v.dir];return;}}      }    cout<<-1; return; //无法到达}int main(){    int num;char ch;    cin>>n>>m;    for(int i=1;i<=n;i++)      for(int j=1;j<=m;j++)      {        cin>>num;        if(num)map[i][j]=map[i-1][j]=map[i][j-1]=map[i-1][j-1]=1; //把块读为点      }    cin>>s.r>>s.c>>tr>>tc;    do{cin>>ch;}while(ch==' ');    s.dir=strchr(dirs,ch)-dirs;    bfs();    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 晚上2点到3点醒怎么办 红米3s变砖了怎么办 6s锁屏密码忘了怎么办 怀孕9个月了胃疼怎么办 怀孕6个月了胃疼怎么办 孕妇胃疼怎么办4个月了 25岁欠了5万块钱怎么办 感冒嗓子疼怎么办最简单的方法 和老婆离婚了我的心好痛怎么办 4s店不给退定金怎么办 教你闪腰了后该怎么办 coolpad酷派手机开不了机怎么办 苹果5s黑屏开不了机怎么办 苹果4s的屏坏了怎么办 苹果6手机充电口接触不良怎么办 5s用久了卡顿怎么办 孕妇血糖高怎么办什么方法降最好 脚砸了肿了紫了怎么办 我想在淘宝上卖东西该怎么办 苹果手机4s开不了机怎么办 冒险岛s前出2条怎么办 狗狗又吐又拉血怎么办 小孩上网成瘾怎么办父母要怎么做 一只眼睛大一只眼睛小怎么办 带近视镜时间长了眼睛变形怎么办 联通卡2g换4g卡怎么办 上火牙疼怎么办教你立刻止疼 吃热的凉的牙疼怎么办 我买的股票退市了怎么办 如果起诉离婚另一方不出庭怎么办 10个月宝宝还没长牙怎么办 超敏c反应蛋白>5怎么办 怀孕才两个月肚子就大了怎么办 腰椎间盘突出腿疼厉害怎么办 打了促排卵针不排卵怎么办 孕34周隐血1十是怎么办 窦性心动过缓伴不齐怎么办 09年买的万科b怎么办 苹果5s手机打不开机怎么办 剖腹产后一年半后意外怀孕怎么办 考驾照挂了5次了怎么办