洛谷1126 机器人搬重物

题目描述

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

【思路】

BFS状态搜索。

思路简单,用x,y,dir,d描述状态信息,因为每个操作的时间均为1所以广搜最短路即可。

需要注意的是:

1、   因为机器人直径有1.6,所以用xy表示的机器人所占四个格子的左上角,因此机器人不能位于n行m列。

2、   判断一个行动是否可行不能只判断起始点,而应该判断整条路径,check_road。

【代码】

  1. #include<iostream>
  2. #include<cstring>
  3. #include<queue>
  4. #include<cstdlib>
  5. #include<cmath>
  6. using namespace std;
  7.  
  8. const int maxn = +;
  9. const char* dirs = "NESW";
  10.  
  11. inline int dir_id(char c) { return strchr(dirs,c)-dirs; }
  12.  
  13. struct Node{
  14. int x,y,dir,d;
  15. };
  16.  
  17. inline void turn(Node& u,int t) {
  18. if(t==) {u.dir=(u.dir+)%; }
  19. if(t==) {u.dir=(u.dir+)%; }
  20. }
  21.  
  22. int n,m,aim_x,aim_y,f_x,f_y;
  23. char f_dir;
  24. int G[maxn][maxn];
  25. int vis[maxn][maxn][];
  26. queue<Node> q;
  27.  
  28. inline bool inside(int x,int y) { //nm不可达
  29. return x>= && x<n && y>= && y<m && !G[x][y]&&!G[x+][y]&&!G[x+][y+]&&!G[x][y+];
  30. }
  31. inline void if_print(int x,int y,int d) {
  32. if(x==aim_x && y==aim_y) { cout<<d;exit(); }
  33. }
  34. inline bool check_road(int fr_x,int fr_y,int e_x,int e_y) { //检查路径而不能只检查起始点
  35. int dx=e_x-fr_x,dy=e_y-fr_y;
  36. if(dx!=) dx=dx/(abs(dx));if(dy!=) dy=dy/(abs(dy));
  37. int x=fr_x,y=fr_y;
  38. while(x!=e_x || y!=e_y) {
  39. if(!inside(x,y)) return false;
  40. x += dx; y += dy;
  41. }
  42. return inside(x,y);
  43. }
  44. void bfs() {
  45. q.push((Node) {f_x,f_y,dir_id(f_dir),});
  46. vis[f_x][f_y][dir_id(f_dir)]=;
  47. while(!q.empty()) {
  48. Node u=q.front(); q.pop();
  49. int x=u.x,y=u.y,dir=u.dir,d=u.d;
  50. Node u1=u; u1.d++; turn(u1,);
  51. if(!vis[x][y][u1.dir]) { vis[x][y][u1.dir]=; q.push(u1); }
  52. u1=u; u1.d++; turn(u1,);
  53. if(!vis[x][y][u1.dir]) { vis[x][y][u1.dir]=; q.push(u1); }
  54.  
  55. for(int s=;s<=;s++) {
  56. if(dir== && check_road(x,y,x-s,y) &&!vis[x-s][y][dir]) {
  57. vis[x-s][y][dir]=; q.push((Node) {x-s,y,dir,d+}); if_print(x-s,y,d+);
  58. }
  59. if(dir== && check_road(x,y,x,y+s) && !vis[x][y+s][dir]) {
  60. vis[x][y+s][dir]=; q.push((Node) {x,y+s,dir,d+}); if_print(x,y+s,d+);
  61. }
  62. if(dir== && check_road(x,y,x+s,y) && !vis[x+s][y][dir]) {
  63. vis[x+s][y][dir]=; q.push((Node) {x+s,y,dir,d+}); if_print(x+s,y,d+);
  64. }
  65. if(dir== && check_road(x,y,x,y-s) && !vis[x][y-s][dir]) {
  66. vis[x][y-s][dir]=; q.push((Node) {x,y-s,dir,d+}); if_print(x,y-s,d+);
  67. }
  68. }
  69. }
  70. }
  71.  
  72. int main() {
  73. ios::sync_with_stdio(false);
  74. cin>>n>>m;
  75. for(int i=;i<=n;i++) for(int j=;j<=m;j++) cin>>G[i][j];
  76. cin>>f_x>>f_y>>aim_x>>aim_y>>f_dir;
  77.  
  78. bfs();
  79. cout<<-;
  80.  
  81. return ;
  82. }

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

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

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

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

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

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

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

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

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

  5. 洛谷 P1126 机器人搬重物

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 $1.6 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 N×MN \times MN×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. 虚拟机添加磁盘LVM分区

    参考博客:http://kimjinlsgd.blog.51cto.com/1918030/932210 一.查看磁盘情况 新添加一块磁盘. [root@VMhost /]# fdisk -l Dis ...

  2. Challenge Checkio(python)—初尝python练习网站

    最近在找点python语言练习的网站,发现这个网站不错 http://www.checkio.org/ 页面设计的也比较漂亮,比较适合学习python的语法知识.不过注册这个网站 开始就得解决一个py ...

  3. 《编写高质量代码:改善Python程序的91个建议》读后感

    编写高质量代码:改善Python程序的91个建议  http://book.douban.com/subject/25910544/ 1.(建议16)is 用于判断两个对象的id是否相等,==才是判断 ...

  4. ThinkPHP框架安全性能分析

    http://www.freebuf.com/articles/web/59713.html 点击劫持cookie 点击劫持所有链接

  5. Quartz Scheduler 开发指南(1)

    Quartz Scheduler 开发指南(1) 原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/ 实例化调度程序( ...

  6. U当家U盘启动盘制作教程

    U当家U盘启动盘制作工具制作u盘系统安装盘支持老机器.新机器启动以及制作,U当家内置强大的U盘一键重装系统工具支持传统和GPT安装,支持原版操作系统和GHOST操作系统安装(ISO/GHO/WIM), ...

  7. 关于移动端和PC端的交互的区别

    对于现在的移动端设备的普及,移动端上的用户体验成了一个重要的关注点. 看了一些网上的关于移动端的交互和用户体验的知识,这里总结了一些.若有不足的地方,希望大家能够积极补充. PC端和移动端的产品的设计 ...

  8. backbone案例

    http://www.kuqin.com/webpagedesign/20120807/324101.html http://udonmai.com/code/todos-backbone%E6%A1 ...

  9. 在Unity中高效工作(下)

    原地址:http://www.unity蛮牛.com/thread-20005-1-1.html Tips for Creating Better Games and Working More Eff ...

  10. ConfigParser读取记事本、notepad++修改后的配置文件会出现:ConfigParser.MissingSectionHeaderError

    使用ConfigParser来读取配置文件,经常会发现经过记事本.notepad++修改后的配置文件读取时出现下面的问题: ConfigParser.MissingSectionHeaderError ...