• 洛谷—— P1126 机器人搬重物


    https://www.luogu.org/problem/show?pid=1126

    题目描述

    机器人移动学会(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

    搜索入门中,ε=(´ο`*))),麻烦又恶心,广搜每次每种走法、
    注意的几点:黑格子的左侧,左上,上方的格子都不能去,(意会一下),
    如果某个点相当前方向不能走i步,则一定不能走i+1步,已经被阻断。
    方向改变多模拟几次、
     1 #include <cstdio>
     2 #include <queue>
     3 
     4 bool vis[66][66][4];
     5 int n,m,map[66][66];
     6 int arrivex,arrivey;
     7 int fx[4]={-1,0,1,0};
     8 int fy[4]={0,-1,0,1};
     9 struct Node_pos {
    10     int x,y,step;
    11     int direction;
    12 }now;
    13 std::queue<Node_pos>que;
    14 
    15 inline bool can_go(Node_pos now)
    16 {
    17     if(now.x>=n||now.y>=m||now.x<1||now.y<1) return false;
    18     if(vis[now.x][now.y][now.direction]||vis[now.x+1][now.y+1][now.direction]) return 0;
    19     if(vis[now.x+1][now.y][now.direction]||vis[now.x][now.y+1][now.direction]) return 0;
    20     if(map[now.x][now.y]||map[now.x+1][now.y]||map[now.x][now.y+1]||map[now.x+1][now.y+1]) return 0;
    21     return true;
    22 }
    23 
    24 inline void read(int &x)
    25 {
    26     x=0; register char ch=getchar();
    27     for(;ch>'9'||ch<'0';) ch=getchar();
    28     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    29 }
    30 
    31 int AC()
    32 {
    33     read(n),read(m);
    34     for(int x,i=1; i<=n; ++i)
    35       for(int j=1; j<=m; ++j)
    36       {
    37           read(map[i][j]);
    38           if(map[i][j]) map[i][j-1]=map[i-1][j]=map[i-1][j-1]=1;
    39       }
    40     read(now.x);read(now.y);
    41     read(arrivex);read(arrivey);
    42     char s[0];scanf("%s",s);
    43     switch (s[0]) {
    44         case 'N': now.direction=0;break;
    45         case 'W': now.direction=1;break;
    46         case 'S': now.direction=2;break;
    47         case 'E': now.direction=3;break;
    48     }
    49     que.push(now);
    50     vis[now.x][now.y][now.direction]=1;
    51     for(Node_pos to;!que.empty();)
    52     {
    53         to=now=que.front(); que.pop();
    54         
    55 //        printf("%d %d
    ",now.x,now.y);
    56         
    57         if(now.x==arrivex&&now.y==arrivey)
    58         { printf("%d
    ",now.step); return 0; }
    59         for(int i=0; i<3; ++i)
    60         {
    61             to.x+=fx[now.direction];
    62             to.y+=fy[now.direction];
    63             if(map[to.x][to.y]||to.x<1||to.y<1||to.x>=n||to.y>=m) break;
    64 //            if(!can_go(to)) break;  
    65             to.step=now.step+1;
    66 //            vis[to.x+1][to.y][now.direction]=1;
    67 //            vis[to.x][to.y+1][now.direction]=1;
    68 //            vis[to.x+1][to.y+1][now.direction]=1;
    69             
    70             if(to.x==arrivex&&to.y==arrivey)
    71             { printf("%d
    ",to.step); return 0; }
    72             else if(!vis[to.x][to.y][now.direction])
    73             {
    74                 vis[to.x][to.y][now.direction]=1;
    75                 que.push(to);
    76             }
    77         }    to=now;
    78         if(!vis[now.x][now.y][now.direction+1&3])
    79         {
    80             to.direction=now.direction+1&3;
    81             vis[to.x][to.y][to.direction]=1;
    82             to.step=now.step+1; que.push(to);
    83         }
    84         if(!vis[now.x][now.y][now.direction+3&3])
    85         {
    86             to.direction=now.direction+3&3;
    87             vis[to.x][to.y][to.direction]=1;
    88             to.step=now.step+1; que.push(to);
    89         }
    90     }    puts("-1");
    91     return 0;
    92 }
    93 
    94 int Hope=AC();
    95 int main(){;} 
    
    
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    51Nod一级算法1002数塔取数问题
    素数筛法
    辗转相除法求最大公约数
    模型评估与选择
    Linux下的五种IO模型
    浮点类型丢失精度的问题
    Update操作浅析,一定是先Delete再Insert吗?
    SQLSERVER中返回修改后的数据
    MachineKey生成
    Katana的起源
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7482291.html
Copyright © 2020-2023  润新知