#P15630. [2021年保加利亚国家队组队赛Junior]Robocars机器人车

[2021年保加利亚国家队组队赛Junior]Robocars机器人车

题目描述

两个机器人车迷失在一个仓库中。机器人车编号为 12

仓库由 RC 列的方格组成。每个方格要么是障碍格,要么是两个机器人车都可以经过的空格。

你可以远程控制机器人车。每条命令包含两部分:

  1. 要控制的机器人车编号,取值为 12
  2. 移动方向,取值为 UDLR,分别表示上、下、左、右。

如果目标格是障碍格、已经被另一辆机器人车占据,或者在仓库范围外,则该命令不会改变任何东西,机器人车停留在原处。

如果目标格是空格或停车位,则该机器人车移动到目标格。

机器人车不会报告自己的精确位置。每执行一条命令后,你唯一能得到的信息是两个机器人车之间当前的曼哈顿距离。

如果两个机器人车分别位于 (r1, c1)(r2, c2),则它们之间的曼哈顿距离为:

|r1 - r2| + |c1 - c2|

初始时,两辆机器人车位于仓库中两个不同的位置。

你的任务是发出一系列命令,使两辆机器人车最终分别停在给定的两个停车位上。两辆车可以任意对应两个停车位,也就是说,只要最终两个停车位都被机器人车占据即可。

实现要求

本题是函数式任务。你需要提交一个 C++ 文件,实现如下函数:

void robo(int R, int C, char store[][201], int dist);

该函数会在开始时由评测程序调用一次,参数含义如下:

  • R:仓库行数;
  • C:仓库列数;
  • store:仓库地图,是 R 个长度为 C 的字符串;
  • dist:两辆机器人车初始位置之间的曼哈顿距离。

地图中只会出现以下字符:

字符 含义
. 空格
# 障碍格
P 停车位

保证地图中恰好有两个 P。传给你的地图中不会标出两辆机器人车的初始位置,它们所在的格子会被视为 .

为了发出移动命令,你需要调用函数:

int output(int robot, char direction);

其中:

  • robot 为机器人车编号,必须是 12
  • direction 为移动方向,必须是 'U''D''L''R'

函数返回执行该命令之后,两辆机器人车之间的曼哈顿距离。

你的提交文件开头应包含:

#include "robo.h"

你的文件可以包含其他辅助代码和函数,但不能包含 main 函数,也不能从标准输入读入或向标准输出写出任何内容。

评测程序会在任务完成时终止运行并判为成功。若程序因超时、非法命令、或 robo 函数结束时任务仍未完成而终止,则判为失败。

数据范围

  • 2 <= R, C <= 200
  • 所有可通行格连通;
  • 保证至少存在一个既不是障碍格、也没有被机器人车占据的格子;
  • 40% 的测试中,R, C <= 25

示例通信

实际仓库如下:

4 5
##P1.
.##..
.....
2...P

传给选手程序的地图会把机器人车初始位置改成空格:

##P..
.##..
.....
....P

初始曼哈顿距离为:

|1 - 4| + |4 - 1| = 6

一次可能的通信过程如下:

调用 说明
robo(4, 5, 转换后的仓库, 6) 评测程序调用选手函数。
output(1, 'L') 机器人 1 向左移动,进入一个停车位。
output(2, 'R') 机器人 2 向右移动。
机器人 2 继续向右移动。
机器人 2 进入另一个停车位,任务完成。

本地测试说明

本包中提供了 template_robo.cpp 作为提交模板。正式提交时只需要提交实现 robo 函数的代码,不需要写 main

若需要本地调试,可将自己的 robo.cppgrader.cpprobo.h 放在同一目录下,并用类似命令编译:

g++ -std=c++17 -O2 robo.cpp grader.cpp -o robo

本地输入格式为:

第一行输入 R C

接下来 R 行输入真实仓库地图,字符可以为 .#P12。其中:

  • P 恰好出现两次;
  • 12 分别表示两辆机器人车的初始位置,且各出现一次;
  • 传给选手函数时,12 会被替换为 .

@下发文件