洛谷 P1126 机器人搬重物

题目描述

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 $1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×MN \times 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,M50) ,下面 NNN 行是储藏室的构造, 000 表示无障碍, 111 表示有障碍,数字之间用一个空格隔开。接着一行有 444 个整数和 111 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 EEE ,南 SSS ,西 WWW ,北 NNN ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式:

一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 −1-11 。

输入输出样例

输入样例#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\n");
72     else
73         printf("%d\n",ans);
74     return 0;
75 }

猜你喜欢

转载自www.cnblogs.com/rlt1296/p/9342490.html