题目描述
机器人移动学会(RMI
)现在正尝试用机器人搬运物品。机器人的形状是一个直径 $1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×MN imes MN×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动 111 步(Creep
);向前移动2步(Walk
);向前移动 333 步(Run
);向左转(Left
);向右转(Right
)。每个指令所需要的时间为 111 秒。请你计算一下机器人完成任务所需的最少时间。
输入输出格式
输入格式:
第一行为两个正整数 N,M(N,M≤50)N,M(N,M le 50)N,M(N,M≤50) ,下面 NNN 行是储藏室的构造, 000 表示无障碍, 111 表示有障碍,数字之间用一个空格隔开。接着一行有 444 个整数和 111 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 EEE ,南 SSS ,西 WWW ,北 NNN ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 −1-1−1 。
输入输出样例
输入样例#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
明显是宽搜。
首先要把网格图转化为点图,
其次对于每一个状态要存储三个信息行号列号方向。
注意走两步的情况一定要注意不能越过障碍物。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<climits> 5 #include<cstdio> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 int n,m,sx,sy,dx,dy,ans=INT_MAX,c[55][55][5],u[]={0,1,0,-1},v[]={1,0,-1,0}; 10 bool b[55][55]; 11 char dr[11]; 12 struct cll 13 { 14 int x,y,dir; 15 }tmp1,tmp2; 16 queue<cll>q; 17 map<char,int>mp; 18 int main() 19 { 20 mp['E']=0,mp['S']=1,mp['W']=2,mp['N']=3; 21 memset(c,-1,sizeof(c)); 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=n;i++) 24 for(int j=1;j<=m;j++) 25 { 26 int t; 27 scanf("%d",&t); 28 if(t==1) 29 b[i][j]=b[i-1][j]=b[i][j-1]=b[i-1][j-1]=1; 30 } 31 scanf("%d%d%d%d%s",&sx,&sy,&dx,&dy,&dr); 32 tmp1.x=sx,tmp1.y=sy,tmp1.dir=mp[dr[0]]; 33 q.push(tmp1); 34 c[sx][sy][tmp1.dir]=0; 35 while(!q.empty()) 36 { 37 tmp1=q.front(); 38 q.pop(); 39 for(int i=1;i<=3;i++)//Ç°½ø 40 { 41 tmp2.x=tmp1.x+i*u[tmp1.dir],tmp2.y=tmp1.y+i*v[tmp1.dir],tmp2.dir=tmp1.dir; 42 if(tmp2.x>0&&tmp2.x<n&&tmp2.y>0&&tmp2.y<m&&!b[tmp2.x][tmp2.y]) 43 { 44 if(c[tmp2.x][tmp2.y][tmp2.dir]==-1) 45 { 46 q.push(tmp2); 47 c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+1; 48 } 49 } 50 else 51 break; 52 } 53 tmp2.x=tmp1.x,tmp2.y=tmp1.y;//תÏò 54 tmp2.dir=(tmp1.dir+3)%4; 55 if(c[tmp2.x][tmp2.y][tmp2.dir]==-1) 56 { 57 q.push(tmp2); 58 c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+1; 59 } 60 tmp2.dir=(tmp1.dir+1)%4; 61 if(c[tmp2.x][tmp2.y][tmp2.dir]==-1) 62 { 63 q.push(tmp2); 64 c[tmp2.x][tmp2.y][tmp2.dir]=c[tmp1.x][tmp1.y][tmp1.dir]+1; 65 } 66 } 67 for(int i=0;i<=3;i++) 68 if(c[dx][dy][i]!=-1) 69 ans=min(ans,c[dx][dy][i]); 70 if(ans==INT_MAX) 71 printf("-1 "); 72 else 73 printf("%d ",ans); 74 return 0; 75 }