机器人搬重物(BFS,方向变化)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<queue>
using namespace std;
const int Maxn=55;
int n,m,sx,sy,tx,ty;
bool mp[Maxn][Maxn];//地图 
bool vis[Maxn][Maxn][4];//标记状态有没有来过 
int xx[]={-1,0,1,0};
int yy[]={0,1,0,-1};//往各个方向走 
struct Robot{
	int x,y,s,d;//坐标,时间,方向 
};
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int t;
			scanf("%d",&t);
			if(t){
				mp[i][j]=mp[i-1][j]=mp[i][j-1]=mp[i-1][j-1]=1;//将障碍物放到地图上 
			}
		}
	}
	queue< Robot > Q;
	char tt;
	scanf("%d %d %d %d %c",&sx,&sy,&tx,&ty,&tt);  
	Robot t1;
	t1.x=sx;t1.y=sy;t1.s=0;//打包起始状态 
	if(tt=='N')t1.d = 0;
	if( tt=='E')t1.d=1;
	if(tt=='S')t1.d=2;
	if(tt=='W')t1.d=3;
	Q.push(t1);//将起始状态压入 
	while(!Q.empty()){
		t1 = Q.front();
		vis[t1.x][t1.y][t1.d] = 1;//标记这个点来过 
		if ( t1.x == tx && t1.y == ty){//到了终点 
			printf("%d",t1.s);
			return 0;
		}
		Robot t = t1;
		t.s ++;//时间+1 
		t.d = (t.d+1)%4;//往左转 
		if( !vis[t.x][t.y][t.d]){
			Q.push(t);
		}
		t.d=(t.d+2)%4;//往右转 
		if( !vis[t.x][t.y][t.d]){
			Q.push(t);
		}
		t.d=t1.d;
		t.x+=xx[t.d];
		t.y+=yy[t.d];
		if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前一步 
			Q.push(t);
			t.x+=xx[t.d];
			t.y+=yy[t.d];
			if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前两步 
		      	Q.push(t);
		     	t.x+=xx[t.d];
		     	t.y+=yy[t.d];
		    	if(t.x>=1&&t.x<n&&t.y>=1&&t.y<m&&!vis[t.x][t.y][t.d]&&!mp[t.x][t.y]){//向前三步 
		    	Q.push(t);
	        	}
		
	    	}
		
		}
		Q.pop();//这个点完成任务 
	}
	printf("-1");
	return 0; 
}
发布了160 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/104795677