题目描述

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

输出样例#1:

12

源代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define INF 999999999
#define N 10001
using namespace std;
int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
bool map[51][51];
int vis[51][51];
int head=1,tail;
struct node{int x;int y;int dir;int step;
}a[N];
int ans[5001]={-1};
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){bool a;cin>>a;if(a){map[i][j]=1;map[i-1][j-1]=1;map[i-1][j]=1;map[i][j-1]=1;}}for(int i=1;i<=n;i++){map[n][i]=1;map[i][m]=1;}int sx,sy,ex,ey;char sdir;cin>>sx>>sy>>ex>>ey>>sdir;/*预处理*/a[++tail].x=sx;a[tail].y=sy;a[tail].step=0;if(sdir=='E')a[tail].dir=1;if(sdir=='W')a[tail].dir=2;if(sdir=='S')a[tail].dir=3;if(sdir=='N')a[tail].dir=4;memset(vis,1,sizeof(vis));int tot=0;int minl=INF;while(head<=tail)//搜索{if(a[head].x==ex&&a[head].y==ey)ans[++tot]=a[head].step;for(int i=1;i<=4;i++){int step=a[head].step;if(i!=a[head].dir)//如果方向不一样,则需转弯,步数加一{step=a[head].step+1;if((i==1&&a[head].dir==2)||(i==2&&a[head].dir==1)||(i==3&&a[head].dir==4)||(i==4&&a[head].dir==3)) //如果向后转,需要转两次弯step=a[head].step+2;}for(int j=1;j<=3;j++)//枚举步数{int xx=a[head].x+j*dir[i][0];int yy=a[head].y+j*dir[i][1];if(xx>n||xx<1||yy>m||yy<=0||map[xx][yy])break;if(vis[xx][yy]>step)//保存最优解{a[++tail].x=xx;a[tail].y=yy;a[tail].step=step+1;a[tail].dir=i;vis[xx][yy]=step;}}}head++;}for(int i=1;i<=tot;i++) //寻找最优解{if(ans[i]<minl)minl=ans[i];}if(minl<INF)cout<<minl;elsecout<<-1;return 0;
}

机器人搬重物(洛谷-P1126)相关推荐

  1. CSU-1975 机器人搬重物(BFS)

    1975: 机器人搬重物 Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 64     Solved: 10 Description ...

  2. 洛谷P1126 机器人搬重物【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...

  3. 洛谷网 1126机器人搬重物 优先队列搜索 一般

    点击打开题目 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可 ...

  4. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  5. 【BZOJ3205_洛谷3638】[APIO2013]机器人(动态规划)

    题目: 洛谷3638 分析: 卡了一天的神题--(OrzJumpmelon) 首先预处理出从点\(p\)向\(d\)方向出发最终能到达的点\(nxt[p][d]\).这个可以直接记忆化搜索解决.如果出 ...

  6. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  7. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  8. 洛谷P4016 负载平衡问题

    洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...

  9. 模拟退火总结+洛谷模板题(P1337 [JSOI2004]平衡点 / 吊打XXX)

    原来就听说过模拟退火,然后一直觉得神奇,但是没有真正的去实现这个算法. 模拟退火对TSP之类的问题很实用. 1.概念:模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一 ...

最新文章

  1. Android socket 编程 实现消息推送(一)
  2. 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
  3. Error opening terminal: xterm-256color
  4. 让TA们告诉你,疫情当下如何更彪悍的成长
  5. [C++11]基于范围的for循环
  6. 【机器学习】sklearn k-近邻算法
  7. 荣耀开年第一机!荣耀60 SE今日官宣:搭载天玑900处理器
  8. asp.net下Response.ContentType类型汇总
  9. 考研编程练习---StringMatching(后缀表达式)
  10. 30 System类
  11. 提取一个文件中的相同的文件类型
  12. GC.Collect
  13. 计算机网络按覆盖地域分为,计算机网络按其所覆盖的地域范围一般可分为________ 。...
  14. Laravel Eloquent 必备的实用技巧
  15. vue项目性能优化(图片优化)
  16. CPU超频全方位攻略
  17. Introducing a forensics data type taxonomy of acquirable artefacts from PLCs
  18. UI设计基础知识点整理,值得收藏「干货」!
  19. Python 学习知识点梳理
  20. excel单元格内加空格_怎样在excel的单元格中的一列数字间添加两空格?

热门文章

  1. 资源 | 想进行数据科学项目却没有数据集?26个数据集网站汇总
  2. STM32之通用定时器输入捕获模式
  3. opencv 膨胀_【3】OpenCV图像处理模块(5)更多的形态学变换(开、闭、形态梯度、顶帽、黑帽)...
  4. 深入理解MySQL底层架构,看这一篇文章就够了!
  5. 讲点码德!避免这些代码坏味道,努力做一名优秀的程序员
  6. 梁鑫:重构 - 在美股行情系统的实践
  7. DevOps落地成不成,关键不在持续集成?
  8. 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)
  9. 架构设计:微服务模式下,实现灰度发布模式
  10. SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件