机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:
-
向前移动
1
步(
Creep
); -
向前移动
2
步(
Walk
); -
向前移动
3
步(
Run
); -
向左转(
Left
); -
向右转(
Right
)。
每个指令所需要的时间为 1 秒。请你计算一下机器人完成任务所需的最少时间。
输入格式
第一行为两个正整数 N,M ( 1≤N,M≤50 ),下面 N 行是储藏室的构造, 0 表示无障碍, 1 表示有障碍,数字之间用一个空格隔开。接着一行有 4 个整数和 1 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 E ,南 S ,西 W ,北 N ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 -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
本题是一个很典型的dfs题,但坑点很多,一连坑了我好多次。。。。不嘻嘻
- 首先就是计算转向的时间,我将NSWE是个方向代数为1,2,3,4,然后取他们差的绝对值,代表转向的时间,但是没有注意到4和1相差3,但实际上只用1秒,这个错纯属犯病。。。写太快了.
- 然后就是如何将输入的方格图转化为格点图,这个要画出图来
- 之后就是机器人走三步的时候有可能跳过障碍,但这是不允许的,所以需要剪枝
- 最后就是要用优先队列优先取出tm最小的节点
- 还有就是它测试用例的一些毒点,比如起点卡墙里(@-@!
- 具体细节在代码里
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<iomanip>
// 其他代码部分省略
标签:游戏攻略