标签:输出 试验 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 }
标签:输出 试验 using pen sof -- string turn 时间
原文地址:http://www.cnblogs.com/yasar/p/6341228.html