[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;
}
posted @ 2019-08-24 15:13  OItby  阅读(118)  评论(0编辑  收藏  举报