华师一附中OI组

标题: P1126 机器人搬重物 [打印本页]

作者: admin    时间: 2018-5-13 20:00
标题: P1126 机器人搬重物
https://www.luogu.org/problemnew/show/P1126


题目描述
机器人移动学会(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。



输入输出样例
输入样例#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
作者: 倚窗倾听风吹雨    时间: 2018-9-12 20:42
  1. #include<iostream>
  2. #include<queue>
  3. #include<cmath>
  4. using namespace std;
  5. const int M=55;
  6. struct node
  7. {
  8.     int t,r,c,time;
  9. }p;
  10. char ch;
  11. bool o[M][M],flag;
  12. queue<node>q;
  13. int n,m,gr,gc,vis[M][M],ans[5001],tot;
  14. int main()
  15. {
  16.     cin>>n>>m;
  17.     for(int i=1; i<=n; i++)
  18.         for(int j=1; j<=m; j++)
  19.         {
  20.             cin>>flag;
  21.             if(flag)
  22.             {
  23.                 o[i][j]=1;
  24.                 o[i-1][j-1]=1;
  25.                 o[i-1][j]=1;
  26.                 o[i][j-1]=1;
  27.             }
  28.             vis[i][j]=99999;
  29.         }
  30.         for(int i=1;i<=n;i++)
  31.     {
  32.         o[n][i]=1;
  33.         o[i][m]=1;
  34.     }

  35.     flag=0;
  36.     cin>>p.r>>p.c;
  37.     p.time=0;
  38.     cin>>gr>>gc;
  39.     cin>>ch;
  40.     if(ch=='N')
  41.         p.t=1;
  42.     if(ch=='E')
  43.         p.t=2;
  44.     if(ch=='S')
  45.         p.t=3;
  46.     if(ch=='W')
  47.         p.t=4;
  48.     q.push(p);
  49.     while(!q.empty())
  50.     {
  51.         if(q.front().r==gr && q.front().c==gc)
  52.             ans[++tot]=q.front().time;
  53.         for(int i=1; i<=4; i++)
  54.         {
  55.             p.t=q.front().t;
  56.             p.c=q.front().c;
  57.             p.r=q.front().r;
  58.             p.time=q.front().time+1;
  59.             if(i!=p.t)
  60.             {
  61.                 p.time++;
  62.                 if(abs(p.t-i)==2)p.time++;
  63.             }
  64.             p.t=i;
  65.             for(int j=1;j<=3;j++)
  66.             {
  67.                 if(i==1)p.r--;
  68.                 if(i==2)p.c++;
  69.                 if(i==3)p.r++;
  70.                 if(i==4)p.c--;
  71.                 if(o[p.r][p.c] || p.r<=0 || p.c<=0 || p.r>n || p.c>m)break;
  72.                 if(vis[p.r][p.c]>p.time)
  73.                 {
  74.                     q.push(p);
  75.                     vis[p.r][p.c]=p.time;
  76.                 }
  77.             }
  78.         }
  79.         q.pop();
  80.     }
  81.     if(tot==0)cout<<"-1"<<endl;
  82.     else
  83.     {
  84.         for(int i=1;i<=tot;i++)ans[1]=min(ans[1],ans[i]);
  85.         cout<<ans[1]<<endl;
  86.     }
  87.     return 0;
  88. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2