末影之眼

PDF 视图

提交程序


分数: 16
时间限制: 0.512s
内存限制: 256M

作者:
题目类型

要塞的传送门房间

题目背景

末影之眼(Eye of Ender)是一种用于定位要塞和激活末地传送门的可合成物品。

末影之眼能够用来定位末地传送门(及传送门所在的要塞):

  • 手持末影之眼并按下使用键,末影之眼会飞向最近的要塞,飞过大约 12 个方块的距离,穿过必要的方块,并在其经过的地方留下一条带有紫色粒子的痕迹,此种粒子和末影箱的相同。
  • 如果距离要塞很远,末影之眼就会飞得更高,以便在垂直方向上更明确指示玩家必须通过的路径。
  • 当玩家接近要塞所在的纵向坐标轴时,末影之眼会更精准地飞行来定位这条 Y 轴。这也就意味着末影之眼可能会向下飞行,指示出玩家在要塞的上方,让玩家向下挖。
  • 在空中飞行 2–3 秒后,末影之眼会在空中悬浮一会儿,然后掉落,变成可拾取的物品,或者有 20\% 的概率消失。因此,一颗末影之眼可以使用的期望值是 5 次。
  • 末影之眼的飞行功能只在主世界工作,在下界、末地以及没有要塞的世界中不会起作用。

末地传送门需要末影之眼来激活。对着末地传送门框架方块按下使用键可以放置末影之眼。当 12 个全部放满后,末地传送门就会激活。每个末地传送门框架方块在生成时有 10\% 的概率已经放有一颗末影之眼。末影之眼一旦被放置在末地传送门框架上就无法被拆下来。

题目描述

要塞分布

要塞主要生成在主世界地下,并且通常会尽量避开海洋及其变种、沙滩及其变种、沼泽及其变种和深暗之域生物群系生成,因此生成在水下是很少见的情况。

每个世界只会生成 128 个要塞,它们分布于一些指定圆环上的随机位置。每个环都具有一定的半径,其环心都位于这个世界的原点(即 X = 0,Z = 0 处),而不是世界出生点(出生点可能偏离原点数百格)。要塞的生成从入口的螺旋楼梯开始,所以要塞的入口螺旋楼梯所在区块的西北角一定位于环内;但要塞的其他部分可能会超出环的范围。每个环上的要塞大致上都是以均等角度分散的(例如,第一个环上的 3 个要塞与中心的连线大致两两间隔 120 度)。

要塞从中间的第一个环开始生成,然后在第二个环生成,然后在第三个环生成,以此类推,直到总数达到 128。

本世界采用简化的环距参数:第 c 环(c = 0, 1, \ldots, 7)中的要塞到原点的距离约为 2048 + 3072c 格,偏差不超过 640 格。

环 要塞数量 距原点的距离(格)
0 3 1408 \sim 2688
1 6 4480 \sim 5760
2 10 7552 \sim 8832
3 15 10624 \sim 11904
4 21 13696 \sim 14976
5 28 16768 \sim 18048
6 36 19840 \sim 21120
7 9 22912 \sim 24192

下图展示了世界原点以及各个环上的要塞分布:

世界中的要塞分布

同一环内的要塞在方位角上均匀分布:第 0 环的 3 座相隔 120^\circ,第 1 环的 6 座相隔 60^\circ,第 2 环的 10 座相隔 36^\circ,依此类推。第 7 环为剩余的 9 座,其方位角间距不是严格均匀的。不同环之间没有固定的角度关系。

所有要塞的坐标均为整数,具体位置由世界种子决定;每个测试点的世界都是独立随机生成的。

抛掷末影之眼

初始时持有 12 只末影之眼。每次抛掷需要指定一个整数坐标 (x, z);末影之眼会沿紫色粒子轨迹朝与 (x, z) 欧氏距离最近的那座要塞飞行,因此抛掷点不同,它指向的要塞也可能不同。

抛掷后可观测到飞行方向的水平方位角 \theta:以正 x 轴为 0^\circ,逆时针为正,取值范围 [-180^\circ, 180^\circ],精确到 0.1 度。若抛掷点恰好在某座要塞的正上方,约定方位角为 0.0。

下图示意了一次抛掷:玩家所在位置收到的是指向最近要塞的水平方向。

一次抛掷与飞行方向

抛掷后,该末影之眼有 20\% 的概率碎裂并永久失去;未碎裂的末影之眼可以继续使用。每次抛掷之后都可得知当前剩余的末影之眼数量。

作答

只允许作答一次:给出一个整数坐标 (X, Z)。

设作答命中的要塞,其末地传送门在生成时已预填 k 只末影之眼。传送门由 12 个末地传送门框架围成,每个框架在生成时独立地有 10\% 的概率已被插上末影之眼(平均 1.2 个),因此

\displaystyle k \sim B(12,\ 0.1)

通过该测试点需要同时满足以下两个条件:

  1. (X, Z) 与某座要塞的欧氏距离不超过 16 格;
  2. 剩余末影之眼数量不少于 12 - k,即足以点亮该传送门上所有空置的框架。

若在末影之眼耗尽后仍尝试抛掷,或作答坐标不满足上述条件,该测试点不得分。

交互

这是一道交互题,程序通过标准输入输出与交互器通信。

抛掷:输出一行

? x z

交互器返回一行

θ r

其中 \theta 为水平方位角(保留一位小数,单位为度),r 为剩余末影之眼数量。

作答:输出一行

! X Z

输出后程序应当立即结束,该测试点的结果由交互器判定。

注意:

  • 每次输出后必须刷新缓冲区(C++ 使用 fflush(stdout) 或 std::endl,Python 使用 sys.stdout.flush()),否则可能因等待而超时。
  • x、z 的绝对值不得超过 30\,000\,000。
  • 除协议规定的输出外,不得向标准输出输出任何内容;调试信息应写入标准错误。

判题反馈:每个测试点判定后,反馈中会附加一行诊断信息,形如

dist=7.2/16 eyes=11/11

其中 dist 是作答点到最近要塞的欧氏距离(单位为格,容错半径为 16 格),eyes 是作答时的剩余末影之眼数量与点亮该传送门所需的数量(12 - k)。未满足的判据用尖括号标出——<dist=23.4/16> eyes=11/10 表示距离超出 16 格,dist=5.2/16 <eyes=10/11> 表示距离达标但眼数不足。

若抛掷或作答的协议有误(坐标越界、指令无法识别),反馈为 bad throw coords、bad answer coords、bad op '…'。末影之眼耗尽后仍尝试抛掷时,反馈为 dist=NaN/16 <eyes=-1/NaN>;此后再作答仍按正常规则判定距离与眼数。

样例

设某测试点中,第 0 环的 3 座要塞位于 (-1584, -592)、(1344, -1120)、(432, 2560)。

输出 交互器返回 说明
? 0 0 -159.5 12 最近的要塞为 (-1584, -592),方位角约为 -159.5^\circ;本次抛掷未碎裂
? 0 256 -151.8 11 最近的要塞仍为 (-1584, -592);本次抛掷碎裂,剩余数量减一
! -1577 -590 两条射线交会于 (-1577.2, -589.7),取整后作答

作答点到要塞 (-1584, -592) 的距离约为 7.2 格,不超过 16 格;若此时 k \ge 1,则剩余数量 11 \ge 12 - k 亦满足,该测试点通过。

数据范围

  • 抛掷与作答的坐标均为整数,绝对值不超过 30\,000\,000。

评论

目前没有评论。