#P16029. [Lot2016]Babaoarba

[Lot2016]Babaoarba

题目描述

Tassadar 正在和 Zeratul 玩“蒙眼抓人”(baba-oarba)。两人分别位于平面上的两个不同点。若 Tassadar 到 Zeratul 的距离不超过 11 米,就认为 Tassadar 找到了 Zeratul。

Tassadar 每次可以走一步,每步长度恰好为 11 米。每走完一步后,他可以选择保持原方向继续走,也可以改为任意其他方向。为了让游戏不至于太难,Zeratul 会在 Tassadar 每走一步后告诉他:这一步之后 Tassadar 是否离自己更近了。

请帮助 Tassadar 尽快找到 Zeratul。

本题为库函数式交互题。你不需要读入任何数据,也不需要输出任何内容。你只需要实现函数 play(),并在其中调用评测器提供的函数 makeStep()

选手需要实现的函数

你的源文件中必须实现如下函数:

void play();

评测器会在程序开始时调用一次 play()

可调用函数

play() 中,你可以任意次调用如下函数:

int makeStep(double direction);

调用该函数表示 Tassadar 沿 direction 方向走一步,方向用弧度制表示。也就是说,若当前坐标为 (x,y)(x,y),调用后坐标变为:

(x+cos(direction), y+sin(direction)).(x+\\cos(direction),\ y+\\sin(direction)).

该函数返回值如下:

  • -1:走完这一步后,Tassadar 到 Zeratul 的距离不超过 1+1091+10^{-9},即已经找到 Zeratul;
  • 1:走完这一步后,Tassadar 到 Zeratul 的距离至少减少了 10910^{-9}
  • 0:不属于以上两种情况。

一旦 makeStep() 返回 -1,你就不能再调用它。否则该测试点得 00 分。

提交格式

你应提交一个 C++ 源文件,实现 play() 函数。例如:

#include "header.h"
#include <cmath>

void play() {
    // 在这里调用 makeStep(direction)
}

评测时会自动提供 header.h 和评测器文件,并与你的程序一起编译。

限制与评分

设初始时 Tassadar 与 Zeratul 的距离为 DD

  • 1<D1000001 < D \le 100000
  • 游戏过程中 Zeratul 始终不动;
  • 每个测试点按调用 makeStep() 的次数给分:
    • 若调用次数不超过 D+50\lceil D\rceil+50,得到该测试点 100%100\% 分;
    • 若调用次数不超过 D+100\lceil D\rceil+100,得到该测试点 60%60\% 分;
    • 若调用次数不超过 1.5D+100\lceil 1.5D\rceil+100,得到该测试点 20%20\% 分;
    • 否则得到 00 分。

交互示例

下面的示例仅用于说明调用过程。假设初始时 Tassadar 在 (0,0)(0,0),Zeratul 在 (2,1.7)(2,1.7)

评测器动作 选手动作 说明
play() - 评测器调用 play()
return 1 makeStep(1.5707963) 向北走一步,距离变近。
再向北走一步,距离仍变近。
return 0 第三次向北走后没有变近。
return 1 makeStep(-1.5707963) 向南走一步,距离变近。
makeStep(0.0) 向东走一步,距离变近。
return -1 再向东走一步,到达距离不超过 11 米的位置。

@下发文件