luogu P1126 机器人搬重物 题解

题目描述

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

输入输出格式

输入格式:

第一行为两个正整数\(N,M(N,M≤50)\),下面\(N\)行是储藏室的构造,\(0\)表示无障碍,\(1\)表示有障碍,数字之间用一个空格隔开。接着一行有\(4\)个整数和\(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啦啦啦。

注意一下细节。

这个机器人是要占4个格子的。

然后加了一个优化:

用f数组记忆化bfs。

下附代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
int n,m,a[55][55],fx,fy,tx,ty,tu,INF;
bool vis[55][55][6];
int dis[55][55][6];
struct node{
int x,y,turn;
};
bool check(int x,int y){
if(a[x][y]==0&&a[x+1][y]==0&&a[x][y+1]==0&&a[x+1][y+1]==0){
return 1;
}
return 0;
}
void print(){
for(int k=1;k<=4;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cout<<dis[i][j][k]<<" ";
puts("");
}
cout<<k<<endl;
system("pause");
system("cls");
}
}
void bfs(){
memset(vis,0,sizeof(vis));
memset(dis,63,sizeof(dis));INF=dis[0][0][0];
dis[fx][fy][tu]=0;
vis[fx][fy][tu]=1;
queue<node> q;
node p;p.x=fx;p.y=fy;p.turn=tu;q.push(p);
while(!q.empty()){
node u=q.front();q.pop();
vis[u.x][u.y][u.turn]=0;
// print();
// cout<<"bfs "<<u.x<<" "<<u.y<<" "<<u.turn<<" ";
// cout<<dis[u.x][u.y][u.turn]<<endl;
if(u.turn==1){
if(u.x+1<=n-1&&check(u.x+1,u.y)&&dis[u.x+1][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x+1][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x+1][u.y][u.turn]==0){
vis[u.x+1][u.y][u.turn]=1;
node tmp;
tmp.x=u.x+1;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x+1,u.y)&&u.x+2<=n-1&&check(u.x+2,u.y)&&dis[u.x+2][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x+2][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x+2][u.y][u.turn]==0){
vis[u.x+2][u.y][u.turn]=1;
node tmp;
tmp.x=u.x+2;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x+1,u.y)&&check(u.x+2,u.y)&&u.x+3<=n-1&&check(u.x+3,u.y)&&dis[u.x+3][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x+3][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x+3][u.y][u.turn]==0){
vis[u.x+3][u.y][u.turn]=1;
node tmp;
tmp.x=u.x+3;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
} if(dis[u.x][u.y][2]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][2]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][2]==0){
vis[u.x][u.y][2]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=2;
q.push(tmp);
}
}
if(dis[u.x][u.y][4]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][4]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][4]==0){
vis[u.x][u.y][4]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=4;
q.push(tmp);
}
}
} if(u.turn==2){
if(u.y+1<=m-1&&check(u.x,u.y+1)&&dis[u.x][u.y+1][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y+1][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y+1][u.turn]==0){
vis[u.x][u.y+1][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y+1;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x,u.y+1)&&u.y+2<=m-1&&check(u.x,u.y+2)&&dis[u.x][u.y+2][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y+2][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y+2][u.turn]==0){
vis[u.x][u.y+2][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y+2;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x,u.y+1)&&check(u.x,u.y+2)&&u.y+3<=m-1&&check(u.x,u.y+3)&&dis[u.x][u.y+3][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y+3][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y+3][u.turn]==0){
vis[u.x][u.y+3][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y+3;tmp.turn=u.turn;
q.push(tmp);
}
} if(dis[u.x][u.y][3]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][3]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][3]==0){
vis[u.x][u.y][3]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=3;
q.push(tmp);
}
}
if(dis[u.x][u.y][1]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][1]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][1]==0){
vis[u.x][u.y][1]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=1;
q.push(tmp);
}
}
} if(u.turn==3){
if(u.x-1>=1&&check(u.x-1,u.y)&&dis[u.x-1][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x-1][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x-1][u.y][u.turn]==0){
vis[u.x-1][u.y][u.turn]=1;
node tmp;
tmp.x=u.x-1;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x-1,u.y)&&u.x-2>=1&&check(u.x-2,u.y)&&dis[u.x-2][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x-2][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x-2][u.y][u.turn]==0){
vis[u.x-2][u.y][u.turn]=1;
node tmp;
tmp.x=u.x-2;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x-1,u.y)&&check(u.x-2,u.y)&&u.x-3>=1&&check(u.x-3,u.y)&&dis[u.x-3][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x-3][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x-3][u.y][u.turn]==0){
vis[u.x-3][u.y][u.turn]=1;
node tmp;
tmp.x=u.x-3;tmp.y=u.y;tmp.turn=u.turn;
q.push(tmp);
}
} if(dis[u.x][u.y][4]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][4]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][4]==0){
vis[u.x][u.y][4]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=4;
q.push(tmp);
}
}
if(dis[u.x][u.y][2]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][2]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][2]==0){
vis[u.x][u.y][2]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=2;
q.push(tmp);
}
}
} if(u.turn==4){
if(u.y-1>=1&&check(u.x,u.y-1)&&dis[u.x][u.y-1][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y-1][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y-1][u.turn]==0){
vis[u.x][u.y-1][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y-1;tmp.turn=u.turn;
q.push(tmp);
}
// puts("WA");
}
if(check(u.x,u.y-1)&&u.y-2>=1&&check(u.x,u.y-2)&&dis[u.x][u.y-2][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y-2][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y-2][u.turn]==0){
vis[u.x][u.y-2][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y-2;tmp.turn=u.turn;
q.push(tmp);
}
}
if(check(u.x,u.y-1)&&check(u.x,u.y-2)&&u.y-3>=1&&check(u.x,u.y-3)&&dis[u.x][u.y-3][u.turn]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y-3][u.turn]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y-3][u.turn]==0){
vis[u.x][u.y-3][u.turn]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y-3;tmp.turn=u.turn;
q.push(tmp);
}
} if(dis[u.x][u.y][1]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][1]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][1]==0){
vis[u.x][u.y][1]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=1;
q.push(tmp);
}
}
if(dis[u.x][u.y][3]>dis[u.x][u.y][u.turn]+1){
dis[u.x][u.y][3]=dis[u.x][u.y][u.turn]+1;
if(vis[u.x][u.y][3]==0){
vis[u.x][u.y][3]=1;
node tmp;
tmp.x=u.x;tmp.y=u.y;tmp.turn=3;
q.push(tmp);
}
}
} }
}
int main(){
freopen("robot.in","r",stdin);
freopen("robot.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=read();
}
}
fx=read();fy=read();tx=read();ty=read();char ch;cin>>ch;
// swap(fx,fy);swap(tx,ty);
switch(ch){
case 'E':tu=2;break;
case 'S':tu=1;break;
case 'W':tu=4;break;
case 'N':tu=3;break;
}
// cout<<tu<<endl;
bfs();
// cout<<dis[tx][ty][1]<<endl; int ans=min(min(dis[tx][ty][1],dis[tx][ty][2]),min(dis[tx][ty][3],dis[tx][ty][4]));
/*
cout<<dis[tx][ty][1]<<endl;
cout<<dis[tx][ty][2]<<endl;
cout<<dis[tx][ty][3]<<endl;
cout<<dis[tx][ty][4]<<endl;
*/
if(ans>=INF-1) printf("-1\n");
else printf("%d\n",ans);
return 0;
}

luogu P1126 机器人搬重物 题解的更多相关文章

  1. luogu P1126 机器人搬重物

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

  2. P1126 机器人搬重物

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

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

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

  4. 洛谷P1126 机器人搬重物

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

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

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

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

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

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

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

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

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

  9. 洛谷 P1126 机器人搬重物

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

随机推荐

  1. Turn Off The Light HDU - 6307

    题目大意 是有n个位置有灯,告诉你每个位置灯是开着的还是关着的,告诉你你的初始位置p,你可以往左或者右移动一步(在1到n的范围里移动), 并且在移动后必须按下开关(就是使当前打开的灯关上,当前未打开的 ...

  2. linux环境下安装PHP扩展swoole

    swoole linux环境下的安装 最近在折腾一个伪直播页面,需求中有用到评论 开始在想直接ajax直接实现,不过想了想觉得对数据库读写太过频繁 而且对服务器压力也挺大的 百度一番发现了这么个东西 ...

  3. django中模板变量与内置标签以及过滤器

    本文参考 官方文档 . 一  模板变量 格式: {{ variable_name }} variable_name   命名规则与变量命名规则类似,允许字符数字下划线,不允许标点. variable_ ...

  4. 「Vue」过滤器

    #全局过滤器要写在var vue之前<td>{{item.time | ctime }}</td>Vue.filter('ctime'(过滤器名),function(data( ...

  5. P1792 [国家集训队]种树

    P1792 [国家集训队]种树 题目描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树. 园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每 ...

  6. [Java] I/O底层原理之一:字符流、字节流及其源码分析

    关于 I/O 的类可以分为四种: 关于字节的操作:InputStream 和 OutPutStream: 关于字符的操作:Writer 和 Reader: 关于磁盘的操作:File: 关于网络的操作: ...

  7. 笔记 oracle 创建主键自增长

    笔记 (1) 创建表 create table test( id number(18,2) primary key, -- 主键(unique+not null) name varchar2(100) ...

  8. Block的copy时机

    什么时候栈上的Block会复制到堆上呢? 1.调用Block的copy实例方法 2.Block作为函数返回值返回时 3.将Block赋值给附有__strong修饰符id类型的类或Block类型成员变量 ...

  9. [非常重要的总结] Linux C相关函数

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  10. jmeter编写beanshell及内置方法的使用

    (一)BeanShell简介 BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命 ...