#P15630. [2021年保加利亚国家队组队赛Junior]Robocars机器人车
[2021年保加利亚国家队组队赛Junior]Robocars机器人车
题目描述
两个机器人车迷失在一个仓库中。机器人车编号为 1 和 2。
仓库由 R 行 C 列的方格组成。每个方格要么是障碍格,要么是两个机器人车都可以经过的空格。
你可以远程控制机器人车。每条命令包含两部分:
- 要控制的机器人车编号,取值为
1或2; - 移动方向,取值为
U、D、L、R,分别表示上、下、左、右。
如果目标格是障碍格、已经被另一辆机器人车占据,或者在仓库范围外,则该命令不会改变任何东西,机器人车停留在原处。
如果目标格是空格或停车位,则该机器人车移动到目标格。
机器人车不会报告自己的精确位置。每执行一条命令后,你唯一能得到的信息是两个机器人车之间当前的曼哈顿距离。
如果两个机器人车分别位于 (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为机器人车编号,必须是1或2;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.cpp 与 grader.cpp、robo.h 放在同一目录下,并用类似命令编译:
g++ -std=c++17 -O2 robo.cpp grader.cpp -o robo
本地输入格式为:
第一行输入 R C。
接下来 R 行输入真实仓库地图,字符可以为 .、#、P、1、2。其中:
P恰好出现两次;1和2分别表示两辆机器人车的初始位置,且各出现一次;- 传给选手函数时,
1和2会被替换为.。
@下发文件