#P16029. [Lot2016]Babaoarba
[Lot2016]Babaoarba
题目描述
Tassadar 正在和 Zeratul 玩“蒙眼抓人”(baba-oarba)。两人分别位于平面上的两个不同点。若 Tassadar 到 Zeratul 的距离不超过 米,就认为 Tassadar 找到了 Zeratul。
Tassadar 每次可以走一步,每步长度恰好为 米。每走完一步后,他可以选择保持原方向继续走,也可以改为任意其他方向。为了让游戏不至于太难,Zeratul 会在 Tassadar 每走一步后告诉他:这一步之后 Tassadar 是否离自己更近了。
请帮助 Tassadar 尽快找到 Zeratul。
本题为库函数式交互题。你不需要读入任何数据,也不需要输出任何内容。你只需要实现函数 play(),并在其中调用评测器提供的函数 makeStep()。
选手需要实现的函数
你的源文件中必须实现如下函数:
void play();
评测器会在程序开始时调用一次 play()。
可调用函数
在 play() 中,你可以任意次调用如下函数:
int makeStep(double direction);
调用该函数表示 Tassadar 沿 direction 方向走一步,方向用弧度制表示。也就是说,若当前坐标为 ,调用后坐标变为:
该函数返回值如下:
-1:走完这一步后,Tassadar 到 Zeratul 的距离不超过 ,即已经找到 Zeratul;1:走完这一步后,Tassadar 到 Zeratul 的距离至少减少了 ;0:不属于以上两种情况。
一旦 makeStep() 返回 -1,你就不能再调用它。否则该测试点得 分。
提交格式
你应提交一个 C++ 源文件,实现 play() 函数。例如:
#include "header.h"
#include <cmath>
void play() {
// 在这里调用 makeStep(direction)
}
评测时会自动提供 header.h 和评测器文件,并与你的程序一起编译。
限制与评分
设初始时 Tassadar 与 Zeratul 的距离为 。
- ;
- 游戏过程中 Zeratul 始终不动;
- 每个测试点按调用
makeStep()的次数给分:- 若调用次数不超过 ,得到该测试点 分;
- 若调用次数不超过 ,得到该测试点 分;
- 若调用次数不超过 ,得到该测试点 分;
- 否则得到 分。
交互示例
下面的示例仅用于说明调用过程。假设初始时 Tassadar 在 ,Zeratul 在 。
| 评测器动作 | 选手动作 | 说明 |
|---|---|---|
play() |
- | 评测器调用 play()。 |
return 1 |
makeStep(1.5707963) |
向北走一步,距离变近。 |
| 再向北走一步,距离仍变近。 | ||
return 0 |
第三次向北走后没有变近。 | |
return 1 |
makeStep(-1.5707963) |
向南走一步,距离变近。 |
makeStep(0.0) |
向东走一步,距离变近。 | |
return -1 |
再向东走一步,到达距离不超过 米的位置。 |
@下发文件