欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-12 09:37:19
...

机器人搬重物(BFS,方向变化)
机器人搬重物(BFS,方向变化)
机器人搬重物(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; 
}