题目描述
机器人移动学会(RMI
)现在正尝试用机器人搬运物品。机器人的形状是一个直径$1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N \times MN×M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动11步(Creep
);向前移动2步(Walk
);向前移动33步(Run
);向左转(Left
);向右转(Right
)。每个指令所需要的时间为11秒。请你计算一下机器人完成任务所需的最少时间。
输入输出格式
输入格式:
第一行为两个正整数N,M(N,M \le 50)N,M(N,M≤50),下面NN行是储藏室的构造,00表示无障碍,11表示有障碍,数字之间用一个空格隔开。接着一行有44个整数和11个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东EE,南SS,西WW,北NN),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-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
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
int f,tim;
};
char c;
const int N = 55;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int maze[N][N];
bool vis[20000];
int x,y,sx,sy,ex,ey,n,m,f,d,tim;
bool check(int x,int y)
{
if (maze[x][y] || maze[x+1][y] || maze[x][y+1] || maze[x+1][y+1])//障碍物的范围
return 1;
return 0;
}
int fun(int a,int b,int c)//哈希函数每个位置及方向对应唯一的值
{
return c * 2700 + a * 51 + b;
}
int bfs()
{
node dd;
queue<node> q;
dd.x = sx, dd.y = sy;
dd.f = f, dd.tim = 0;
q.push(dd);
while (!q.empty())
{
dd = q.front();
q.pop();
x = dd.x, y = dd.y, f = dd.f, tim = dd.tim;
d = fun(x,y,f);
if (x==ex && y==ey)
return tim;
if (vis[d]) continue;
vis[d] = 1;
dd.tim++;
dd.f = (f + 4 - 1) % 4;//左转
q.push(dd);
dd.f = (f + 4 + 1) % 4;//右转
q.push(dd);
dd.f = f;
for (int i=1;i<=3;i++)
{
int ddx = x + dx[f] * i;
int ddy = y + dy[f] * i;
if (ddx<=0 || ddx>=n || ddy<=0 || ddy>=m || check(ddx,ddy))
break;
dd.x = ddx;
dd.y = ddy;
q.push(dd);
}
}
return -1;
}
int main()
{
//freopen("in.txt","r",stdin);
int i,j;
cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
cin>>maze[i][j];
cin>>sx>>sy>>ex>>ey>>c;
switch(c)
{
case 'N' : f = 0; break;
case 'E' : f = 1; break;
case 'S' : f = 2; break;
case 'W' : f = 3; break;
}
int ans = bfs();
cout<<ans<<endl;
return 0;
}