[Luogu1126] 机器人搬重物
Description
机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个M*N的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。
Input
输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
Output
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。
Sample Input
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
Sample Output
12
题解
简单的\(BFS\)。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxnm=60,maxstep=100001;
const int FQ[2][4]={{1,2,3,0},{3,0,1,2}};
const int ZB[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int n,m,x1,y1,x2,y2,fq1;
int mp[maxnm][maxnm],vis[5][maxnm][maxnm];
struct node
{
int x,y,res,fq;
}Q[maxstep];
int lQ,rQ;
void Mark(int i,int j)
{
mp[i][j]=mp[i+1][j]=mp[i][j+1]=mp[i+1][j+1]=1;
}
void Read()
{
scanf("%d%d",&n,&m);
int num;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
scanf("%d",&num);
if(num) Mark(i,j);
}
++n,++m;
char eswn;
scanf("%d%d%d%d %c",&x1,&y1,&x2,&y2,&eswn);
++x1,++y1,++x2,++y2;
if(eswn=='N') fq1=0;
else if(eswn=='E') fq1=1;
else if(eswn=='S') fq1=2;
else fq1=3;
}
bool Check(int x,int y)
{
if(x<=1||x>=n||y<=1||y>=m) return 0;//注意此处不得走边界
return 1;
}
void Bfs()
{
rQ=lQ=1,Q[1]=(node){x1,y1,0,fq1},vis[fq1][x1][y1]=1;
while(lQ<=rQ)
{
if(Q[lQ].x==x2&&Q[lQ].y==y2)
{
printf("%d\n",Q[lQ].res);
return;
}
int fq;
for(int i=0;i<=1;++i)
{
fq=FQ[i][Q[lQ].fq];
if(!vis[fq][Q[lQ].x][Q[lQ].y])
{
vis[fq][Q[lQ].x][Q[lQ].y]=1,
++rQ,
Q[rQ]=(node){Q[lQ].x,Q[lQ].y,Q[lQ].res+1,fq};
}
}
int xx,yy;
fq=Q[lQ].fq;
for(int i=1;i<=3;++i)
{
xx=Q[lQ].x+ZB[fq][0]*i,
yy=Q[lQ].y+ZB[fq][1]*i;
if((Check(xx,yy))&&(!mp[xx][yy]))
{
if(!vis[fq][xx][yy])
{
vis[fq][xx][yy]=1,
++rQ,
Q[rQ]=(node){xx,yy,Q[lQ].res+1,fq};
}
}
else break;//优化
}
++lQ;
}
puts("-1");
}
int main()
{
Read();
if(mp[x2][y2]) puts("-1");
else Bfs();
return 0;
}
本文作者:OItby @ https://www.cnblogs.com/hihocoder/
未经允许,请勿转载。