loj#P2675. 「NOI2012」三重镇

「NOI2012」三重镇

Cannot parse: undefinedms error parsing time

题目描述

小西同学最近喜欢上了 iOS 游戏《三重镇 Triple Town》。游戏之余,小西也在思考如何才能在这个游戏中获得更高的分数。

如图 1 所示,游戏在一个 n×mn \times m 的地图中进行。游戏给定一个建造序列,玩家按照此建造序列依次选择空白位置建造相应的建筑单位。建筑有九个不同的等级,由低到高分别为 Grass, Bush, Tree, Hut, ...等(为了方便描述,我们称之为 L1,L2,L3,,L9L_1 , L_2 , L_3 , \ldots, L_9)。

当玩家在一个空白位置建造单位之后,有可能引起反应。反应的构成条件是:从这个格子出发,与该建筑单位等级相同的格子所构成的连通块大小大于等于 33,则这个连通块将被合并为一个下一等级的建筑,此建筑的位置为最后建造的建筑单位位置,连通块中其他位置将变回空格。这里的连通块是指直接或者间接相邻的位置集合。另外需要注意的是,L9L_9 为建筑的最高等级,所以多个 L9L_9 的连通块并不会合并。例如在下图中,当建造了中间的 L1L_1 之后,与该位置相连的 L1L_1 就被合并成了一个 L2L_2

注意,在合并的过程中,可能会引起连环反应。如下图所示。

游戏的得分取决于玩家建造和反应生成的单位,建造或者反应生成建筑单位就可以获得相应的分数。不同等级建筑的得分表如下:

以刚才的两个游戏过程为例。图 2 中,首先建造了 L1L_1,将得到 44 分。随后,L1L_1 进行了反应生成了 L2L_2,此时再得到 2020 分。总共得分为 2424。而在图 3 中,这一步操作得分为 4+20+100+500=6244+20+100+500=624 分。

为了降低游戏的难度,游戏中还设有两种道具,分别为“星星”和“炸弹”。

在游戏开始时,玩家被给定 pp 个星星道具和 qq 个炸弹道具,玩家可以在任意时刻使用。两者功能如下:

  • “星星”道具:可以放置在一个空格位置。当星星被放置时,星星会自动变为能引起反应的最高等级建筑。当在该位置不能引起任何反应时,星星变为 L1L_1。例如,在图 3 正中间位置放置星星,星星自动变为 L3L_3。星星的得分按照变化后的建筑计算得分。
  • “炸弹”道具:炸弹道具可以放在在一个有建筑的位置上,作用为炸掉这个建筑并将该位置恢复为空格。当使用炸弹时,得分将扣除被炸掉的建筑的一半分数(即,得分为负数)。

在游戏的进行过程中,玩家必须按照给定的顺序进行建造,但可以随时穿插使用两种道具。游戏的目标是,通过合理的操作,取得最高的分数。

为了更好的帮助同学们理解这个游戏,小西还编写了一个简单的游戏 Demo 放在选手目录中,大家可以进行简单的尝试以帮助理解。

输入格式

该题为提交答案型试题,所有输入数据 tritown1.in~tritown10.in 已在试题目录下。

对于每个数据,输入文件中第一行为两个整数 n,mn, m,表示地图一共包含 nnmm 列。

接下来一行包含两个整数 p,qp, q,分别表示道具星星和道具炸弹的数目。

接下来 nn 行包含一个 n×mn \times m 的初始地图。其中字符 .表示空地,数字 11~99 分别表示相应等级的建筑。

再接下来一行包含一个数字 kk,表示建造序列的长度。

最后一行包含 kk 个空格隔开的 11~99 之间的数字,表示建造序列的内容。

输出格式

针对给定的 1010 个输入文件 tritown1.in~tritown10.in,你需要分别提交你的输出文件 tritown1.out~tritown10.out

输出文件包含玩家进行游戏的指令,共 4 种指令:

指令 含义
PUT x y 将建造序列中的下一个单位放置到第 xx 行第 yy 列的空格中。
STAR x y 放置星星道具到第 xx 行第 yy 列的空格中。
BOMBER x y 在第 xx 行第 yy 列放置炸弹,此位置必须非空。
END 游戏结束,结算当前得分。

输出必须以 END 指令结尾,玩家可以在任意时刻结束游戏。

2 3
1 1
..1
221
2
1 3
PUT 1 2
PUT 1 1
STAR 2 1
END

数据范围与提示

对于每组数据,我们设置了 99 个评分参数 a10,a9,,a2a_{10} ,a_9 ,\ldots,a_2。如果选手的输出不合法,则得零分。否则,设在你的方案中,游戏得分为 wuserw_{user},你的分数等于最大的满足 wuseraiw_{user} \ge a_{i}ii。如果没有这样的 ii,则得 11 分。