机器人搬重物(BFS,方向变化)
程序员文章站
2022-06-12 09:37:19
...
#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;
}
下一篇: 机器人搬重物(洛谷-P1126)