题目描述
机器人移动学会(RMI
)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N×M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep
);向前移动2步(Walk
);向前移动3步(Run
);向左转(Left
);向右转(Right
)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。
输入输出格式
输入格式:
第一行为两个正整数N,M(N,M≤50),下面NN行是储藏室的构造,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
障碍方块要转换成点
不能走墙
这个题目写了我三个多小时 吃完晚饭就在写 一直写到九点半
将近崩溃 最后发现发现出现了问题 心态爆炸
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey,s,vis[55][55][5],flag;
int a[55][55];
char ss;
struct node
{
int x,y,z,t;
};
void bfs()
{
node e;
e.x=sx;
e.y=sy;
e.z=s;
e.t=0;
vis[sx][sy][s]=1;//初始化
queue<node>q;
q.push(e);
while(!q.empty())
{
e=q.front();
q.pop();
//cout<<e.x<<" "<<e.y<<" "<<e.z<<" "<<e.t<<endl;
if(e.x==ex&&e.y==ey)//到达终点
{
flag=e.t;
return;
}
if(e.z==1)//方向为北
{
int p=e.z+1;
if(p==5) p=1;
if(vis[e.x][e.y][p]==0)
{
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}//左转
p=e.z-1;
if(p==0) p=4;
if(vis[e.x][e.y][p]==0)
{
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}//右转
for(int i=1;i<=3;i++)//向前走
{
int xx=e.x-i;
if(a[xx][e.y]!=0) break;
if(vis[xx][e.y][e.z]==0&&xx<n&&xx>0&&a[xx][e.y]==0)
{
vis[xx][e.y][e.z]=1;
node r;
r.x=xx;
r.y=e.y;
r.z=e.z;
r.t=e.t+1;
q.push(r);
}
}
}//下面的同上 四个方向
if(e.z==2)
{
int p=e.z+1;
if(p==5) p=1;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
p=e.z-1;
if(p==0) p=4;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
for(int i=1;i<=3;i++)
{
int yy=e.y-i;
if(a[e.x][yy]!=0) break;
if(vis[e.x][yy][e.z]==0&&yy<m&&yy>0&&a[e.x][yy]==0)
{
node r;
r.x=e.x;
r.y=yy;
r.z=e.z;
r.t=e.t+1;
q.push(r);
}
}
}
if(e.z==3)
{
int p=e.z+1;
if(p==5) p=1;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
p=e.z-1;
if(p==0) p=4;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
for(int i=1;i<=3;i++)
{
int xx=e.x+i;
if(a[xx][e.y]!=0) break;
if(vis[xx][e.y][e.z]==0&&xx<n&&xx>0&&a[xx][e.y]==0)
{
vis[xx][e.y][e.z]=1;
node r;
r.x=xx;
r.y=e.y;
r.z=e.z;
r.t=e.t+1;
q.push(r);
}
}
}
if(e.z==4)
{
int p=e.z+1;
if(p==5) p=1;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
p=e.z-1;
if(p==0) p=4;
if(vis[e.x][e.y][p]==0)
{
vis[e.x][e.y][p]=1;
node r;
r.x=e.x;
r.y=e.y;
r.z=p;
r.t=e.t+1;
q.push(r);
}
for(int i=1;i<=3;i++)
{
int yy=e.y+i;
if(a[e.x][yy]!=0) break;
if(yy<m&&yy>0&&vis[e.x][yy][e.z]==0&&a[e.x][yy]==0)
{
vis[e.x][yy][e.z]=1;
node r;
r.x=e.x;
r.y=yy;
r.z=e.z;
r.t=e.t+1;
q.push(r);
}
}
}
}
}
int main()
{
//freopen("in.txt","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int xxx;
cin>>xxx;
if(xxx)
{
a[i][j]=1;
a[i-1][j-1]=1;
a[i-1][j]=1;
a[i][j-1]=1;
}
}//把障碍方块转化成点
for(int i=0;i<=m;i++)
{
a[n][i]=1;
a[i][m]=1;
a[0][i]=1;
a[i][0]=1;
}//不能走墙
cin>>sx>>sy>>ex>>ey>>ss;
if(ss=='N') s=1;
if(ss=='W') s=2;
if(ss=='S') s=3;
if(ss=='E') s=4;//方向换成数字
flag=-1;
bfs();
cout<<flag<<endl;
return 0;
}