码迷,mamicode.com
首页 > 其他好文 > 详细

2017/1/22

时间:2017-01-22 19:32:59      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:输出   试验   using   pen   sof   --   string   turn   时间   

机器人搬重物

(robot.cpp/c/pas)

   机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M 的网格, 有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间 内把物品搬运到指定的地方。机器人接受的指令有:先前移动1 步(Creep);向前移动2 步(Walk );向前移动3 步(Run);向左转(Left);向右转(Right)。每个指令所需要的时 间为1 秒。请你计算一下机器人完成任务所需的最少时间。 

输入
输入的第一行为两个正整数N,M (N,M<=50),下面N 行是储藏室的构造,0 表示无障
碍,1 表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别
为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),
数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-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


输出样例
12

 

一个记忆化广搜,记录次数就行了

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <map>
 7 using namespace std;
 8 bool mm[60][60];
 9 struct point
10 {
11     int x,y,z;
12 };
13 int sx,sy,ex,ey,n,m;
14 char d;
15 int fx[4]={-1,0,1,0},fy[4]={0,1,0,-1};
16 int f[60][60][4];
17 queue<point> q;
18 map<char,int> ma;
19 int main()
20 {
21     freopen("robot.in","r",stdin);
22     freopen("robot.out","w",stdout);
23     cin>>n>>m;
24     ma[N]=0;
25     ma[E]=1;
26     ma[S]=2;
27     ma[W]=3;
28     for(int i=1;i<=n;i++)
29     for(int j=1;j<=m;j++)
30     {
31         bool b;
32         cin>>b;
33         if(b)
34         {
35         mm[i-1][j-1]=mm[i-1][j]=mm[i][j-1]=mm[i][j]=1;
36         }
37     }
38     n--;
39     m--;
40     cin>>sx>>sy>>ex>>ey>>d;
41     q.push((point){sx,sy,ma[d]});
42     memset(f,127/3,sizeof(f));
43     f[sx][sy][ma[d]]=0;
44     while(!q.empty())
45     {
46     point k=q.front();
47     if(f[k.x][k.y][k.z]+1<f[k.x][k.y][(k.z+1)%4])
48     {
49         f[k.x][k.y][(k.z+1)%4]=f[k.x][k.y][k.z]+1;
50         q.push((point){k.x,k.y,(k.z+1)%4});
51     }
52     if(f[k.x][k.y][k.z]+1<f[k.x][k.y][(k.z+3)%4])
53     {
54         f[k.x][k.y][(k.z+3)%4]=f[k.x][k.y][k.z]+1;
55         q.push((point){k.x,k.y,(k.z+3)%4});
56     }
57     for(int i=1;i<=3;i++)
58     {
59         int nx=k.x+i*fx[k.z],ny=k.y+i*fy[k.z];
60         if((f[k.x][k.y][k.z]+1<f[nx][ny][k.z])&&(mm[nx][ny]!=1)&&nx>0&&nx<=n&&ny>0&&ny<=m)
61         {
62         f[nx][ny][k.z]=f[k.x][k.y][k.z]+1;
63         q.push((point){nx,ny,k.z});
64         }
65         else
66         break;
67     }
68     q.pop();
69     }
70     int mmin=2147483647;
71     for(int i=0;i<=3;i++)
72     if(f[ex][ey][i]<mmin)
73         mmin=f[ex][ey][i];
74     if(mmin<4000)
75     cout<<mmin<<endl;
76     else
77     cout<<-1<<endl;
78     return 0;
79 }

 

2017/1/22

标签:输出   试验   using   pen   sof   --   string   turn   时间   

原文地址:http://www.cnblogs.com/yasar/p/6341228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!