洛谷P1126 机器人搬重物(bfs) 题解

题目来源:

点击打开链接

题目描述:

题目描述

机器人移动学会(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,M50) ,下面 NN 行是储藏室的构造, 00 表示无障碍, 11 表示有障碍,数字之间用一个空格隔开。接着一行有 44 个整数和 11 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 EE ,南 SS ,西 WW ,北 NN ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式:

一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 -11 。

输入输出样例

输入样例#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











解题思路:

   本题好像在poj上见过,关键是要考虑机器人的半径,不能当作一个点,而且对图的处理也很重要,可以把障碍物统一放在右上角也可以放在左上角,就是一定要统一,不然就会乱,还有就是在判重的时候要开个三维数组,因为还有方向要考虑,最后也是在搜索的时候分类讨论方向,前进1,2,3,都要考虑。。。

代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int tu[55][55];
struct newt{
	int x,y,time;
	char dir;
}dian;
int n,m;
void cl(int x,int y)
{
	if(x-1>=1){
		tu[x-1][y]=1;
	}
	if(y-1>=1){
		tu[x][y-1]=1;
	}
	if(x-1>=1&&y-1>=1){
		tu[x-1][y-1]=1;
	}
	return ;
}
priority_queue<newt>pq;
bool operator <(newt a,newt b)
{
	return a.time>b.time;
}
bool jl[55][55][4];
bool pd(newt a)
{
	if(a.x>=1&&a.x<n&&a.y>=1&&a.y<m&&!tu[a.x][a.y])
	{
		if(a.dir=='E'&&!jl[a.x][a.y][0])return 1;
		if(a.dir=='W'&&!jl[a.x][a.y][1])return 1;
		if(a.dir=='S'&&!jl[a.x][a.y][2])return 1;
		if(a.dir=='N'&&!jl[a.x][a.y][3])return 1;
	}
	return 0;
}
int main()
{
	memset(jl,0,sizeof(jl));
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		scanf("%d",&tu[i][j]);
		if(tu[i][j]==1)cl(i,j);
	}
	int bx,by,ex,ey;
	scanf("%d%d%d%d",&bx,&by,&ex,&ey);
	char c;
	cin>>c;
	dian.x=bx;dian.y=by;
	if(tu[bx][by]==1){
		cout<<-1<<endl;
		return 0;
	}
	if(bx==ex&&by==ey){
		cout<<0<<endl;
		return 0;
	}
	dian.time=0;
	dian.dir=c;
	pq.push(dian);
	if(c=='E'){
		jl[bx][by][0]=1;
	}
	else if(c=='W'){
		jl[bx][by][1]=1;
	}
	else if(c=='S'){
		jl[bx][by][2]=1;
	}
	else {
		jl[bx][by][3]=1;
	};
	int flagg=0,tt=1000000;
	while(!pq.empty())
	{
		newt now=pq.top();
		if(now.x==ex&&now.y==ey){
			flagg=1;
			tt=now.time;
			break;
		}
		pq.pop();
		if(now.dir=='E'){
			if(!jl[now.x][now.y][1])
			{
				newt nod=now;
				nod.dir='W';
				nod.time=now.time+2;
				pq.push(nod);
				jl[now.x][now.y][1]=1;
			}
			if(!jl[now.x][now.y][2])
			{
				newt nod=now;
				nod.dir='S';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][2]=1;
			}
			if(!jl[now.x][now.y][3])
			{
				newt nod=now;
				nod.dir='N';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][3]=1;
			}
			newt nod;
			int flag=0,flag1=0;
			nod.y=now.y+1;
			nod.x=now.x;
			nod.time=now.time+1;
			nod.dir=now.dir;
			if(pd(nod)){
				pq.push(nod);
				jl[nod.x][nod.y][0]=1;
				flag=1;
			}
			nod.y=now.y+2;
			if(pd(nod)&&flag)
			{
				pq.push(nod);
				jl[nod.x][nod.y][0]=1;
				flag1=1;
			}
			nod.y=now.y+3;
			if(pd(nod)&&flag1)
			{
				pq.push(nod);
				jl[nod.x][nod.y][0]=1;
			}
		}
		else if(now.dir=='W'){
			if(!jl[now.x][now.y][0])
			{
				newt nod=now;
				nod.dir='E';
				nod.time=now.time+2;
				pq.push(nod);
				jl[now.x][now.y][0]=1;
			}
			if(!jl[now.x][now.y][2])
			{
				newt nod=now;
				nod.dir='S';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][2]=1;
			}
			if(!jl[now.x][now.y][3])
			{
				newt nod=now;
				nod.dir='N';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][3]=1;
			}
			newt nod;
			int flag=0,flag1=0;
			nod.y=now.y-1;
			nod.x=now.x;
			nod.time=now.time+1;
			nod.dir=now.dir;
			if(pd(nod)){
				pq.push(nod);
				jl[nod.x][nod.y][1]=1;
				flag=1;
			}
			nod.y=now.y-2;
			if(pd(nod)&&flag)
			{
				pq.push(nod);
				jl[nod.x][nod.y][1]=1;
				flag1=1;
			}
			nod.y=now.y-3;
			if(pd(nod)&&flag1)
			{
				pq.push(nod);
				jl[nod.x][nod.y][1]=1;
			}
		}
		else if(now.dir=='S'){
			if(!jl[now.x][now.y][3])
			{
				newt nod=now;
				nod.dir='N';
				nod.time=now.time+2;
				pq.push(nod);
				jl[now.x][now.y][3]=1;
			}
			if(!jl[now.x][now.y][0])
			{
				newt nod=now;
				nod.dir='E';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][0]=1;
			}
			if(!jl[now.x][now.y][1])
			{
				newt nod=now;
				nod.dir='W';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][1]=1;
			}
			newt nod;
			int flag=0,flag1=0;
			nod.y=now.y;
			nod.x=now.x+1;
			nod.time=now.time+1;
			nod.dir=now.dir;
			if(pd(nod)){
				pq.push(nod);
				jl[nod.x][nod.y][2]=1;
				flag=1;
			}
			nod.x=now.x+2;
			if(pd(nod)&&flag)
			{
				pq.push(nod);
				jl[nod.x][nod.y][2]=1;
				flag1=1;
			}
			nod.x=now.x+3;
			if(pd(nod)&&flag1)
			{
				pq.push(nod);
				jl[nod.x][nod.y][2]=1;
			}
		}
		else {
			if(!jl[now.x][now.y][2])
			{
				newt nod=now;
				nod.dir='S';
				nod.time=now.time+2;
				pq.push(nod);
				jl[now.x][now.y][2]=1;
			}
			if(!jl[now.x][now.y][0])
			{
				newt nod=now;
				nod.dir='E';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][0]=1;
			}
			if(!jl[now.x][now.y][1])
			{
				newt nod=now;
				nod.dir='W';
				nod.time=now.time+1;
				pq.push(nod);
				jl[now.x][now.y][1]=1;
			}
			newt nod;
			int flag=0,flag1=0;
			nod.x=now.x-1;
			nod.y=now.y;
			nod.time=now.time+1;
			nod.dir=now.dir;
			if(pd(nod)){
				pq.push(nod);
				jl[nod.x][nod.y][3]=1;
				flag=1;
			}
			nod.x=now.x-2;
			if(pd(nod)&&flag)
			{
				pq.push(nod);
				jl[nod.x][nod.y][3]=1;
				flag1=1;
			}
			nod.x=now.x-3;
			if(pd(nod)&&flag1)
			{
				pq.push(nod);
				jl[nod.x][nod.y][3]=1;
			}
		}
	}
	if(flagg){
		cout<<tt<<endl;
	}
	else cout<<-1<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40400202/article/details/80959658
今日推荐