题目描述

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

输入输出格式

输入格式:

第一行为两个正整数 N,M(N,M≤50)N,M(N,M \le 50)N,M(N,M≤50) ,下面 NNN 行是储藏室的构造, 000 表示无障碍, 111 表示有障碍,数字之间用一个空格隔开。接着一行有 444 个整数和 111 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 EEE ,南 SSS ,西 WWW ,北 NNN ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式:

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

输入输出样例

输入样例#1: 复制

  1. 9 10
  2. 0 0 0 0 0 0 1 0 0 0
  3. 0 0 0 0 0 0 0 0 1 0
  4. 0 0 0 1 0 0 0 0 0 0
  5. 0 0 1 0 0 0 0 0 0 0
  6. 0 0 0 0 0 0 1 0 0 0
  7. 0 0 0 0 0 1 0 0 0 0
  8. 0 0 0 1 1 0 0 0 0 0
  9. 0 0 0 0 0 0 0 0 0 0
  10. 1 0 0 0 0 0 0 0 1 0
  11. 7 2 2 7 S
输出样例#1: 复制

  1. 12
  2.  
  3. 明显是宽搜。
    首先要把网格图转化为点图,
    其次对于每一个状态要存储三个信息行号列号方向。
    注意走两步的情况一定要注意不能越过障碍物。
  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<climits>
  5. #include<cstdio>
  6. #include<queue>
  7. #include<map>
  8. using namespace std;
  9. int n,m,sx,sy,dx,dy,ans=INT_MAX,c[][][],u[]={,,,-},v[]={,,-,};
  10. bool b[][];
  11. char dr[];
  12. struct cll
  13. {
  14. int x,y,dir;
  15. }tmp1,tmp2;
  16. queue<cll>q;
  17. map<char,int>mp;
  18. int main()
  19. {
  20. mp['E']=,mp['S']=,mp['W']=,mp['N']=;
  21. memset(c,-,sizeof(c));
  22. scanf("%d%d",&n,&m);
  23. for(int i=;i<=n;i++)
  24. for(int j=;j<=m;j++)
  25. {
  26. int t;
  27. scanf("%d",&t);
  28. if(t==)
  29. b[i][j]=b[i-][j]=b[i][j-]=b[i-][j-]=;
  30. }
  31. scanf("%d%d%d%d%s",&sx,&sy,&dx,&dy,&dr);
  32. tmp1.x=sx,tmp1.y=sy,tmp1.dir=mp[dr[]];
  33. q.push(tmp1);
  34. c[sx][sy][tmp1.dir]=;
  35. while(!q.empty())
  36. {
  37. tmp1=q.front();
  38. q.pop();
  39. for(int i=;i<=;i++)//Ç°½ø
  40. {
  41. tmp2.x=tmp1.x+i*u[tmp1.dir],tmp2.y=tmp1.y+i*v[tmp1.dir],tmp2.dir=tmp1.dir;
  42. if(tmp2.x>&&tmp2.x<n&&tmp2.y>&&tmp2.y<m&&!b[tmp2.x][tmp2.y])
  43. {
  44. if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
  45. {
  46. q.push(tmp2);
  47. c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
  48. }
  49. }
  50. else
  51. break;
  52. }
  53. tmp2.x=tmp1.x,tmp2.y=tmp1.y;//תÏò
  54. tmp2.dir=(tmp1.dir+)%;
  55. if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
  56. {
  57. q.push(tmp2);
  58. c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
  59. }
  60. tmp2.dir=(tmp1.dir+)%;
  61. if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
  62. {
  63. q.push(tmp2);
  64. c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
  65. }
  66. }
  67. for(int i=;i<=;i++)
  68. if(c[dx][dy][i]!=-)
  69. ans=min(ans,c[dx][dy][i]);
  70. if(ans==INT_MAX)
  71. printf("-1\n");
  72. else
  73. printf("%d\n",ans);
  74. return ;
  75. }

洛谷 P1126 机器人搬重物的更多相关文章

  1. 洛谷P1126 机器人搬重物

    洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...

  2. 洛谷——P1126 机器人搬重物

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

  3. 洛谷 P1126 机器人搬重物 (BFS)

    题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...

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

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

  5. 洛谷P1126机器人搬重物[BFS]

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

  6. 洛谷—— P1126 机器人搬重物

    https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...

  7. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  8. P1126 机器人搬重物

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

  9. luogu P1126 机器人搬重物

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

随机推荐

  1. AbstractQueuedSynchronizer

    1 简介 AbstractQueuedSynchronizer简称AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器.JDK1.5中提供的java.util.concurrent包中的大多数的 ...

  2. Nginx+IIS简单的部署

    随着互联网项目用户访问量不断上升,单点web服务器是无法满足大型高并发高负载的业务处理的,为了给web服务器做负载均衡方案,打算采用Nginx搭建负载均衡服务器,把用户请求分配到N个服务器来缓解服务器 ...

  3. FineUIPro v3.6.0 发布了(3 年助力 200 家企业的信息化建设)!

    FineUI(专业版)自从 2014-07-30 发布第一个版本以来,3 年来已经持续更新了 25 个版本,我们的坚持有目共睹,同时也受到了 200 家企业的青睐和信任,感谢一路有你. FineUI( ...

  4. SpringBoot分布式 - SpringCloud

    一:介绍 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

  5. 【Java并发.4】对象的组合

    到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识.然而,我们并不希望对每一系内存访问都进行分析以确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或程序. 4.1 设 ...

  6. python第三章:循环语句--小白博客

    Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非 ...

  7. @RequestBody ajax 415 400

    使用springmvc和Ajax进行数据交互时使用标签@RequestBody时我报了这两个错,刚开始对springmvc的使用和注解有点迷,然后踩坑上了. 先说下怎么才会踩上去.首先@Request ...

  8. Factors of Factorial AtCoder - 2286 (N的阶乘的因子个数)(数论)

    Problem Statement You are given an integer N. Find the number of the positive divisors of N!, modulo ...

  9. Python删除list里面的重复元素的俩种方法

    1.使用set函数  In [116]: a=[1,2,3,2,1,3,4,5,6,5] In [117]: set(a) Out[117]: {1, 2, 3, 4, 5, 6} 2.使用字典函数 ...

  10. JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数

    jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...