题目描述

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

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<algorithm>
#include<iostream>
#include<cstring>
#include<climits>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
int n,m,sx,sy,dx,dy,ans=INT_MAX,c[][][],u[]={,,,-},v[]={,,-,};
bool b[][];
char dr[];
struct cll
{
int x,y,dir;
}tmp1,tmp2;
queue<cll>q;
map<char,int>mp;
int main()
{
mp['E']=,mp['S']=,mp['W']=,mp['N']=;
memset(c,-,sizeof(c));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int t;
scanf("%d",&t);
if(t==)
b[i][j]=b[i-][j]=b[i][j-]=b[i-][j-]=;
}
scanf("%d%d%d%d%s",&sx,&sy,&dx,&dy,&dr);
tmp1.x=sx,tmp1.y=sy,tmp1.dir=mp[dr[]];
q.push(tmp1);
c[sx][sy][tmp1.dir]=;
while(!q.empty())
{
tmp1=q.front();
q.pop();
for(int i=;i<=;i++)//ǰ½ø
{
tmp2.x=tmp1.x+i*u[tmp1.dir],tmp2.y=tmp1.y+i*v[tmp1.dir],tmp2.dir=tmp1.dir;
if(tmp2.x>&&tmp2.x<n&&tmp2.y>&&tmp2.y<m&&!b[tmp2.x][tmp2.y])
{
if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
{
q.push(tmp2);
c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
}
}
else
break;
}
tmp2.x=tmp1.x,tmp2.y=tmp1.y;//תÏò
tmp2.dir=(tmp1.dir+)%;
if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
{
q.push(tmp2);
c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
}
tmp2.dir=(tmp1.dir+)%;
if(c[tmp2.x][tmp2.y][tmp2.dir]==-)
{
q.push(tmp2);
c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+;
}
}
for(int i=;i<=;i++)
if(c[dx][dy][i]!=-)
ans=min(ans,c[dx][dy][i]);
if(ans==INT_MAX)
printf("-1\n");
else
printf("%d\n",ans);
return ;
}

洛谷 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. 【LeetCode-数组篇】 1 Two Sum

    1 前言 之所以开始刷 LeetCode 上的算法题,一是快面临秋招,第二点是因为提升自己的编程能力,坚持两个月,希望博友们监督. 这个系列打算用 C# 和 Java 编程,为什么用两门语言,因为经历 ...

  2. handsontable 的核心方法

    原文地址:http://blog.csdn.net/mafan121/article/details/46122577 1.为handsontable添加钩子方法 addHook(key,callba ...

  3. Centos7修改系统时区

    timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...

  4. Python-序列化模块-json-62

    序列化模块 Eva_J 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到 ...

  5. H5 59-浮动元素的脱标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 对Vuejs框架原理名词解读

    渐进式()+虚拟Dom: vue-cli 遍历Dom:先序遍历DOM树的5种方法! 三层架构+m v c +mvp+m v vm()+MVC,MVP 和 MVVM 的图示 剖析vue MVVM实现原理 ...

  7. 软件工程启程篇章:C#和四则运算生成与运算

    0x01 :序言 I leave uncultivated today, was precisely yestoday perishes tomorrow which the person of th ...

  8. Debian搭建WordPress

    环境配置 可以使用apt-get快速安装mysql,php5:我是用源码手动安装apache服务器的.安装完mysql后,最好将字符编码设置为utf8的. 接下来就是mysql,apache,php5 ...

  9. 提高工作效率-window热键

    一.虚拟桌面 Ctrl win D          创建另一个桌面 Ctrl win  左右箭头     来回切换桌面 Ctrl win  F4     关闭当前虚拟桌面 二.窗口 win  M  ...

  10. [转帖]buffer与cache的区别

    作者:沈万马链接:https://www.zhihu.com/question/26190832/answer/146259979来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...