P1126 机器人搬重物

题目描述

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

分析:机器人中心总在格点上,这也就是它走动时的中心是格点,而不是格子。我们可以将所有的格子化成点,一个格子化成四个点,
  黑点优先。黑点优先是什么意思、?因为一个点化成四个点,那也就是需要 n*4,m*4个格子,但我们不用这么多,
  其实n
+1,m+1 个格子就可以了。怎么变呢,我们让黑点的化成四个黑点,其他的不变就可以了,题目中的样例处理完厚实这样(看下图,不大好看)

这样我们会发现,只要让机器人考虑机器人的中心就可以了,机器人中心不能到最外圈的格点,机器人的中心不能走黑点,其他的可以都不用考虑。
然后广搜就可以。

注意:要cin读入字符,(为什么不能 scanf("%d%d%d%d%c",&sx,&sy,&ex,&ey,&ch);读空格吗?样例都过了,还是60分。。)
 #include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream> using namespace std;
const int N = ; struct node{
int x,y,step;
int to;
}cur,nxt;
queue<node>q;
int a[N][N];
int mp[N][N];
int dx[]={,,,-}; //东南西北
int dy[]={,,-,};
bool v[N][N][];
int n,m,k,sx,sy,ex,ey;
char ch; void init()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
cin>>ch;
sx++; sy++; ex++; ey++;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(a[i][j]==)
{
mp[i][j] = ;
mp[i+][j] = ;
mp[i][j+] = ;
mp[i+][j+] = ;
}
n++; m++;
} void bfs()
{
if(sx==ex && sy==ey)
{
printf("0\n");
return ;
}
cur.x = sx;
cur.y = sy;
cur.step = ;
switch(ch)
{
case 'E': cur.to=;break;
case 'S': cur.to=;break;
case 'W': cur.to=;break;
case 'N': cur.to=;break;
}
q.push(cur);
v[sx][sy][cur.to] = true;
while(!q.empty())
{
cur = q.front() ;
q.pop();
k = cur.to;
for(int i=;i<=;++i)
{
int xx = cur.x+i*dx[k];
int yy = cur.y+i*dy[k];
if(xx> && xx<n && yy> && yy<m && !mp[xx][yy])
{
if(xx==ex && yy==ey)
{
printf("%d\n",cur.step+);
return;
}
if(v[xx][yy][k]) continue;
v[xx][yy][k]=true;
nxt.x = xx;
nxt.y = yy;
nxt.step = cur.step+;
nxt.to = k;
q.push(nxt);
}
else break;
}
nxt.x = cur.x;
nxt.y = cur.y;
nxt.step = cur.step+;
nxt.to = (cur.to+)%;
if(!v[nxt.x][nxt.y][nxt.to])
{
v[nxt.x][nxt.y][nxt.to] = true;
q.push(nxt);
}
nxt.to = (cur.to-+)%;
if(!v[nxt.x][nxt.y][nxt.to])
{
v[nxt.x][nxt.y][nxt.to] = true;
q.push(nxt);
}
}
printf("-1\n");
} int main()
{
init();
bfs();
return ;
}

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

  1. luogu P1126 机器人搬重物 题解

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

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

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

  3. 洛谷P1126 机器人搬重物

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

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

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

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

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

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

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

随机推荐

  1. angular中ngOnChanges与组件变化检测的关系

    1.ngOnChanges只有在输入值改变的时候才会触发,如果输入值(@Input)是一个对象,改变对象内的属性的话是不会触发ngOnChanges的. 2.组件的变化检测: 2a.changeDet ...

  2. Java实现身份证号码验证源码分享

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  3. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

  4. 树形背包O(n * v^2)入门

    我虽然做了好几道树形背包的题,但是一直不是十分理解,对于每一道题,总是看题解就明白,然后换一道题自己写不出来.临近NOIP,gg让我们强化一下背包以及树形背包,我也恰有此打算,于是又开始从头学习了树形 ...

  5. phpstudy mysql 升级5.7.18

    1.从官网下载MySQL http://dev.mysql.com/downloads/mysql/ 2.解压到想安装到的 例如  C:\phpStudy\MySQL 进入该目录,找到my-defua ...

  6. 从数据库中取出的数据,字段名为gb2312的 数据转码为utf8

    $pj = Pj::find()->where($map)->asArray()->one(); if(!empty($pj)) { foreach ($pj as $k=>$ ...

  7. 【转】Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...

  8. 使用IPDB调试Python代码

    (转载自:https://xmfbit.github.io/2017/08/21/debugging-with-ipdb/) IPDB是什么?IPDB(Ipython Debugger),和GDB类似 ...

  9. HDU 2036 改革春风吹满地 (求多边形面积)

    传送门: 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. write函数过程解析

    write函数作为用户向终端或者文件进行写数据的重要函数,有着重要的作用. |------|          |---------|   |---------| |----------| | wri ...