题目:P1126 机器人搬重物
题目大意: 给出由0,1组成的地图,机器人在地图的中心格点上移动,机器人可以向前移动1步;向前移动2步;向前移动3 步;向左转;向右转。每个指令所需要的时间为1 秒。问到达目的地的最短时间。
解题思路: 这道题目一看就要用广度优先搜索来求解,不过要注意一个地方,那就是机器人是有体积的,所以边界和障碍物的四周,不能走,所以边界条件判断时,n和m各要减1,地图还要进行转换(getMap函数)。重点来了,机器人从起点开始可以走1步,走两步,走三步以及转弯。也就是说把左转右转,走一步两步三步都看成一级,除了位置还包括方向信息,因此我们可以创建三维数组记录状态。队列循环内,包含4(NSWE)*3(一步两步三步)=12种情况,以及左右转两种情况。
代码:
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct Node
{
int x, y, time, direction;
Node() {
}
Node(int a, int b, int c, int d) {
x = a;
y = b;
time = c;
direction = d;
}
};
struct cmp
{
bool operator()(Node a, Node b) {
return a.time > b.time;
}
};
int getDir(char c) {
switch (c) {
case 'E':
return 0; break;
case 'S':
return 1; break;
case 'W':
return 2; break;
case 'N':
return 3; break;
}
}
const int maxn = 55;
const int dx[] = {
0,1,0,-1 }