機器人搬重物(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; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章