题目描述

机器人移动学会(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. ODPS-Java-SDK快速入门

    一.简介 核心接口包括:AliyunAccount,MaxCompute(SDK中使用原名ODPS)等常见对象组件 更多参见文档:https://help.aliyun.com/document_de ...

  2. Angular下载文件

    public Down(path: string) { return this.http.get(path, { responseType: "blob" }).subscribe ...

  3. Jmeter(三十五)_分布式

    jmeter分布式简单步骤说明: 1:添加远程服务器IP到配置文件 在JMETER_HOME / bin / jmeter.properties中,找到名为“ remote_hosts ” 的属性,并 ...

  4. JS判断当前设备类型

    CSS3出来后,我们一般都是通过@media媒体查询来实现网页自适应,但是有时候,还是需要我们根据不同的设备来对应的做不同的显示,这时候,我们需要知道当前用户访问我们的界面用的是什么设备,怎么获取呢? ...

  5. vuex mapState、mapGetters、mapActions、mapMutations的使用

    例子: index.js import Vue from 'vue' import Vuex from 'vuex' import mutations from './mutations' impor ...

  6. Python_练习题_49

    # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao','nezha'] def func(item): re ...

  7. H5 71-网易注册界面4

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

  8. PS调出甜美艺术外景女生照片

    前期思路:拍摄时间大概在下午三四点左右,IOS100 f/1.8 .其实夏天最好的拍摄时间在傍晚五点这样,曝光太强片子会泛白,这张原片首先构图不是很好看,所以我要给它二次构图裁剪一下.下面是裁剪好后的 ...

  9. Linux 下面 PG 的 uuid-ossp 包安装办法

    1. pgsql 安装 时报错, 如图示: 详细信息为: 执行SQL为: CREATE EXTENSION IF NOT EXISTS "uuid-ossp" 错误纤细信息为: C ...

  10. 剑指offer(4)

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...