https://www.luogu.org/problem/show?pid=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

搜索入门中,ε=(´ο`*))),麻烦又恶心,广搜每次每种走法、
注意的几点:黑格子的左侧,左上,上方的格子都不能去,(意会一下),
如果某个点相当前方向不能走i步,则一定不能走i+1步,已经被阻断。
方向改变多模拟几次、
 #include <cstdio>
#include <queue> bool vis[][][];
int n,m,map[][];
int arrivex,arrivey;
int fx[]={-,,,};
int fy[]={,-,,};
struct Node_pos {
int x,y,step;
int direction;
}now;
std::queue<Node_pos>que; inline bool can_go(Node_pos now)
{
if(now.x>=n||now.y>=m||now.x<||now.y<) return false;
if(vis[now.x][now.y][now.direction]||vis[now.x+][now.y+][now.direction]) return ;
if(vis[now.x+][now.y][now.direction]||vis[now.x][now.y+][now.direction]) return ;
if(map[now.x][now.y]||map[now.x+][now.y]||map[now.x][now.y+]||map[now.x+][now.y+]) return ;
return true;
} inline void read(int &x)
{
x=; register char ch=getchar();
for(;ch>''||ch<'';) ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
} int AC()
{
read(n),read(m);
for(int x,i=; i<=n; ++i)
for(int j=; j<=m; ++j)
{
read(map[i][j]);
if(map[i][j]) map[i][j-]=map[i-][j]=map[i-][j-]=;
}
read(now.x);read(now.y);
read(arrivex);read(arrivey);
char s[];scanf("%s",s);
switch (s[]) {
case 'N': now.direction=;break;
case 'W': now.direction=;break;
case 'S': now.direction=;break;
case 'E': now.direction=;break;
}
que.push(now);
vis[now.x][now.y][now.direction]=;
for(Node_pos to;!que.empty();)
{
to=now=que.front(); que.pop(); // printf("%d %d\n",now.x,now.y); if(now.x==arrivex&&now.y==arrivey)
{ printf("%d\n",now.step); return ; }
for(int i=; i<; ++i)
{
to.x+=fx[now.direction];
to.y+=fy[now.direction];
if(map[to.x][to.y]||to.x<||to.y<||to.x>=n||to.y>=m) break;
// if(!can_go(to)) break;
to.step=now.step+;
// vis[to.x+1][to.y][now.direction]=1;
// vis[to.x][to.y+1][now.direction]=1;
// vis[to.x+1][to.y+1][now.direction]=1; if(to.x==arrivex&&to.y==arrivey)
{ printf("%d\n",to.step); return ; }
else if(!vis[to.x][to.y][now.direction])
{
vis[to.x][to.y][now.direction]=;
que.push(to);
}
} to=now;
if(!vis[now.x][now.y][now.direction+&])
{
to.direction=now.direction+&;
vis[to.x][to.y][to.direction]=;
to.step=now.step+; que.push(to);
}
if(!vis[now.x][now.y][now.direction+&])
{
to.direction=now.direction+&;
vis[to.x][to.y][to.direction]=;
to.step=now.step+; que.push(to);
}
} puts("-1");
return ;
} int Hope=AC();
int main(){;}

洛谷—— 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 机器人搬重物

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

  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. C语言——结构体的使用

    C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. 1.建立一个结构体 struct 结构体名{ 成员列表 }; struct Date { int month; int da ...

  2. C语言数组和函数实例练习(二)

    1.C语言中不允许函数的嵌套定义,但可以使用函数的嵌套调用. 例1:输入4个整数,找出其中最大的数. #include <stdio.h> #include <stdlib.h> ...

  3. 初识——Vim

    有些东西吧,总是碰见,低头不见抬头见,但又不知道是什么.用来干嘛的?总是搞的心里痒痒.所以一定要学习一下. 近期一段时间,总是碰到一个词儿:VIM,在这儿看到了,我不理他,隔一会儿丫的又跑我眼睛里,总 ...

  4. [Plugin] 文件上传利器SWFUpload使用指南

    SWFUpload是 一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在项目中用过几次,但它的配置参数太多了,用过后就忘记怎么用了,到以后要用时又得 到官网上看它的文档,真是太烦了. ...

  5. python 数据的基本类型(字符串)

    python 基础 ascii:字母,数字,特殊字符:1个字节(byte) 8个字位(bit)unicode: 16位两个字节,升级32个字节 4个字位utf-8:最少一个字节 8个表示. 英文 8字 ...

  6. RAR 5.50 控制台使用记录

    copy from  WinRAR用户手册,备忘 用户手册 ~~~~~~~~ RAR 5.50 控制台版本 ~~~~~~~~~~~~~~~~~~~ =-=-=-=-=-=-=-=-=-=-=-=-=- ...

  7. WordPress瀑布流主题PinThis中文版v1.6.8

    PinThis主题来源于英语网站http://pinthis.pixelbeautify.com/的汉化(语言文件+控制面板),中文版采用的是翻译器手工核对,并不完美,只对主题中文化,其他没做任何更改 ...

  8. [ Database ] [ SQL Server ] SQL Server 很多不允許的操作解決方法

    說明可參考 https://blog.miniasp.com/post/2012/10/26/SQL-Server-Management-Studio-Prevent-saving-changes-t ...

  9. 【原创】IBM Websphere 报错:JSPG0120E: 为 pageEncoding 属性和匹配 URI 模式的配置元素指定不同的值是非法的。

    websphere中间件,在打开一个jsp页面时报: IBM Websphere 报错:JSPG0120E: 为 pageEncoding 属性和匹配 URI 模式的配置元素指定不同的值是非法的. . ...

  10. Python Tutorial笔记

    Python Tutorial笔记 Python入门指南 中文版及官方英文链接: Python入门指南 (3.5.2) http://www.pythondoc.com/pythontutorial3 ...