• 洛谷 P1126 机器人搬重物


    题目描述

    机器人移动学会(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,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
    ");
    72     else
    73         printf("%d
    ",ans);
    74     return 0;
    75 }
  • 相关阅读:
    Hive 导入、导出数据
    mysql 命令行参数说明
    mysql 查看表信息
    python之冒泡排序
    python之选择排序
    python之快速排序
    光荣之路测试开发面试linux考题之四:性能命令
    测试开发linux面试之三:后台进程之操作
    测试开发面试的Linux面试题总结之二:常用命令
    测试开发面试的Linux面试题总结之一:vim使用方法
  • 原文地址:https://www.cnblogs.com/fantasquex/p/9342490.html
Copyright © 2020-2023  润新知