U96691 暮光原野
题目背景
有一个名为『暮光原野』的游戏,你出生在一个无限的地图中,地图是随机生成的,你并不清楚整个地图的构造,但是你可以通过与系统交互的方式获取你周围环境的信息或者进行移动等操作。
你需要编写一个 $\text{AI}$,与系统进行交互,以操控玩家来获得尽可能多的分数。
题目描述
地图是无限大的,玩家一开始出生在 $(0,0)$ 的位置。地图由若干个格子组成,每个格子可能有如下属性:
----
**空地:** 这个格子空空如也。但是,有些空地上可能带有金币。
**金块:** 这个格子上是一个金块。
**流浪女孩:** 这个格子上有一个会攻击玩家的流浪女孩。
**荆棘:** 这个格子上是致命的荆棘。
**岩浆:** 这个格子上是致命的岩浆。
**冰:** 这个格子上是冰块。
**树:** 这个格子上是树。
**草丛:** 这个格子上是草丛。
----
玩家出生点即 $(0,0)$ 一定是空地。玩家一开始将朝向北方,生命值为 $5$,分数为 $0$。
为了完成交互,你需要调用头文件 $\texttt{darkwild.h}$。
以下的函数均为此头文件中的函数,如果你使用的是 $\texttt{C++}$ 语言,直接调用即可。
如果你由于任何原因无法使用这些函数(比如语言不是 $\texttt{C++}$),你可以通过向标准输出写入你的操作,并在之后从标准输入读入系统返回的结果。写入的内容为对应的函数名,比如一行字符串 $\texttt{Turn\_Left()}$。
玩家可以进行的操作包含:
----
**向左转:**
$\texttt{Turn\_Left()}$
玩家的朝向逆时针旋转 $90°$。
这个函数没有返回值。
**向右转:**
$\texttt{Turn\_Right()}$
玩家的朝向顺时针旋转 $90°$。
这个函数没有返回值。
**向前进:**
$\texttt{Go\_Forward()}$
玩家向着朝向的方向运动一格。
若你走入了一个空地,系统会返回 $0$。
若你走入了一个带有金币的空地,系统会返回 $1$,此时这个格子将变为空地,你将获得 $1$ 分。
以上两种情况,你将成功地完成移动操作。
若你撞了草丛,系统会返回 $-1$。
若你不幸撞了树、冰、流浪女孩或者金块,系统会返回 $-2$。此时你将会扣 $1$ 生命值。
若你不幸走入了岩浆或者荆棘,系统会返回 $-3$。此时你将直接死亡。
以上三种情况,你将不能完成移动操作。
**向后退:**
$\texttt{Go\_Backward()}$
玩家向着朝向的方向的反方向运动一格。
具体内容同 $\texttt{Go\_Forward()}$ 操作。
**向前探:**
$\texttt{Touch()}$
若前面是草丛,系统会返回 $2$。
若前面是树、金块或者冰,系统会返回 $1$。
若前面是岩浆或者空地,系统会返回 $0$。
若前面是荆棘或者流浪女孩,系统会返回 $-1$。此时你将会扣 $1$ 生命值。
**向前击:**
$\texttt{Attack()}$
若前面是树、荆棘或者冰,系统会返回 $-1$。此时你将会扣 $1$ 生命值。
若前面是金块,系统会返回 $2$。此时这个格子将变为空地,你将获得 $3$ 分。
若前面是草丛或者流浪女孩,系统会返回 $1$。
若前面是岩浆或者空地,系统会返回 $0$。
**向下摸:**
$\texttt{Feel()}$
若离玩家曼哈顿距离小于等于 $3$ 的范围内有冰,系统会返回 $-x$,$x$ 为距离玩家最近的冰到玩家的曼哈顿距离。
若离玩家曼哈顿距离小于等于 $3$ 的范围内有岩浆,系统会返回 $x$,$x$ 为距离玩家最近的岩浆到玩家的曼哈顿距离。
若不满足以上两个条件,系统会返回 $0$。
地图保证无论玩家在什么位置都不可能同时满足以上两个条件。
**查询分数:**
$\texttt{Score()}$
系统会返回你当前获得的分数。
**查询生命:**
$\texttt{Health()}$
系统会返回你当前的生命值。若返回值为 $0$,表明你已经死亡。
**结束交互:**
$\texttt{Finish()}$
----
### 地图生成:
地图的生成规则是这样的:
系统随机生成地图以区块为单位,一个区块的大小是 $16\times 16$。一开始系统将生成原点周边的 $4$ 个区块,随着玩家的探索,系统将继续生成新的区块。
已经生成的区块将永久保存,且系统本身不会去修改已经生成了的区块中的内容(除去玩家本身对地图产生的影响,地图一经生成就永远不会改变)。
生成区块时,系统会随机从以下 $3$ 种生物群系中挑选一种作为地图生成器的方式,各种生物群系被生成的概率不同,这取决于具体的数据点信息。
**平原生物群系:** 在这个生物群系中,玩家是相当安全的。除了空地、草丛和金块,这里没有其它任何奇奇怪怪的东西。
草丛:$30\%$
金块:$5\%$
**森林生物群系:** 在这个生物群系中,玩家并不是非常安全。除了草丛和金块,树将随处可见,并且有极小几率刷出荆棘和流浪女孩。庆幸的是,这里没有岩浆或冰块。
草丛:$20\%$
金块:$3\%$
树:$37\%$
荆棘:$1\%$
流浪女孩:$2\%$
**噩梦生物群系:** 在这个生物群系中,玩家时刻冒着死亡的风险。这里有危险的岩浆,并且荆棘和流浪女孩生成的概率也被提高。不过在这个荒凉的地方,很少有草丛和树木。作为补偿,这里会有不少的金块。
草丛:$13\%$
树木:$12\%$
荆棘:$5\%$
流浪女孩:$5\%$
岩浆:$2\%$
冰:$2\%$
金块:$15\%$
你可以通过命令 $\texttt{Biome()}$ 来获得当前的生物群系类型。$0$ 表示平原,$1$ 表示森林,$2$ 表示噩梦。
输入格式
无
输出格式
无
说明/提示
### 评分细节:
最终得分由以下两项相加,并对 $10$ 取 $\min$。
**基础得分:** 你获得的分数除以该数据点的难度系数。
**额外得分:** 若探索过的格子总数大于等于该数据点的探索目标,则额外得到 $2$ 分。若你在一次游戏中探索了所有的生物群系,则额外再得到 $2$ 分。
考虑到有非酋的存在,所以数据点将整体重复 $3$ 次,每 $3$ 个相同的数据将用 $\texttt{SubTask}$ 绑定,并取最高得分作为整个 $\texttt{Subtask}$ 的得分。比如测试点 $1,2,3$ 将是完全相同的且作为 $\texttt{Subtask }1$ 出现,你的 $\texttt{Subtask }1$ 得分为测试点 $1,2,3$ 的最高分。
还有以下交互细节:
请随时用 $\texttt{std::flush}$ 清空缓存。
玩家死亡后只能使用 $\texttt{Score(),Health(),Finish()}$指令,而不应进行其它操作指令。否则将被判 $0$ 分。
使用 $\texttt{Finish()}$ 指令后,应当停止一切交互。否则将被判 $0$ 分。
你不应使用太多操作,否则可能会引起 $\texttt{TLE}$。请将操作数控制在 $10^5$ 之内。
### 数据规模:
$P(a)\to$ 平原生物群系的生成概率。
$P(b)\to$ 森林生物群系的生成概率。
$P(c)\to$ 噩梦生物群系的生成概率。
$D\to$ 难度系数。
$T\to$ 探索目标。
$P(G)\to$ 空地中出现金币的概率。
$\texttt{Subtask }1$:
$P(a)=0.7,P(b)=0.2,P(c)=0.1,D=0.8,T=20,P(G)=0.15$
$\texttt{Subtask }2$:
$P(a)=0.7,P(b)=0.2,P(c)=0.1,D=1,T=50,P(G)=0.1$
$\texttt{Subtask }3$:
$P(a)=0.5,P(b)=0.4,P(c)=0.1,D=1.2,T=65,P(G)=0.14$
$\texttt{Subtask }4$:
$P(a)=0.5,P(b)=0.4,P(c)=0.1,D=1.6,T=90,P(G)=0.08$
$\texttt{Subtask }5$:
$P(a)=0.2,P(b)=0.7,P(c)=0.1,D=1.8,T=110,P(G)=0.13$
$\texttt{Subtask }6$:
$P(a)=0.2,P(b)=0.7,P(c)=0.1,D=2.1,T=130,P(G)=0.09$
$\texttt{Subtask }7$:
$P(a)=0.1,P(b)=0.5,P(c)=0.4,D=2.4,T=170,P(G)=0.11$
$\texttt{Subtask }8$:
$P(a)=0.1,P(b)=0.5,P(c)=0.4,D=2.7,T=240,P(G)=0.07$
$\texttt{Subtask }9$:
$P(a)=0.1,P(b)=0.7,P(c)=0.2,D=3,T=300,P(G)=0.1$
$\texttt{Subtask }10$:
$P(a)=0.1,P(b)=0.7,P(c)=0.2,D=3.3,T=380,P(G)=0.06$