甲午年即将过去,新的一年即将到来。此时此刻,不由得让人想起一些童年的回忆,比如说魔塔。
魔塔是一种固定数值RPG游戏。下面是一张游戏截图:
这个游戏在一个
为了简单起见,我们假设这个魔塔只有一层。
我们用
这个格子可能是空地或不可通行的墙壁,也可能有怪物,或者有宝物,或者是门。
玩家有以下几个属性:
- 生命值
,简称 “生命”。 - 攻击力
,简称 “攻击”。 - 防御力
,简称 “防御”。 - 魔法防御力
,简称 “魔防”。
在任意时刻,玩家的属性都满足
每一种怪物也有以下属性:
- 生命值
- 攻击力
- 防御力
这些属性也都是整数且
玩家与一只怪物战斗时,首先玩家的
攻击方的生命值记为
防御方的生命值记为
while (true)
{
damage = max(0, ATK_0 - DEF_1)
HP_1 = HP_1 - damage
if (HP_1 <= 0)
break
else
交换攻击方和防御方
}
这段伪代码的意思是,每个回合防御方受到“攻击方攻击力”减“防御方防御力”的伤害(小于等于
这时如果玩家的
有些怪物还有一个或两个特殊属性值
属性名称 | 属性效果 | |
---|---|---|
普通 | 无 | |
坚固 | 玩家每回合对怪物造成最多 | |
先攻 | 第一个回合前,怪物先对玩家攻击一次 | |
魔攻 | 怪物的攻击无视玩家的防御(即把玩家的 | |
连击 | 怪物每回合攻击 |
保证
宝物分为以下几种:
- 血瓶:增加一定生命值
- 红宝石:增加一定攻击力
- 蓝宝石:增加一定防御力
- 绿宝石:增加一定魔防
- 钥匙:可以用来开门,开一扇门消耗一把钥匙,其中黄钥匙能开黄门,蓝钥匙能开蓝门,红钥匙能开红门。
玩家从某个位置开始游戏,每次移动只能走到相邻(有公共边)且不是墙壁的格子上。
- 如果这个格子上有怪物,则玩家与这只怪物战斗。
- 如果这个格子上有宝物,则玩家获得这个宝物。
- 如果这个格子是门,则玩家使用相应的钥匙开门。
以上事件结束后,该格子变为空地。
给定玩家的初始状态(位置,
输入格式
该题为提交答案型试题,所有输入数据 tower1.in ~ tower10.in 见数据下载。
第一行两个正整数
接下来四行分别是每种血瓶、红宝石、蓝宝石、绿宝石增加的属性值,
每行第一个非负整数
接下来一行一个正整数
接下来
接下来
- 如果
,则 是一块空地。 - 如果
,则 是一堵墙壁。 - 如果
,则 上有一把钥匙,其中 为黄钥匙, 为蓝钥匙, 为红钥匙。 - 如果
,则 是一扇门,其中 为黄门, 为蓝门, 为红门。 - 如果
,则 上有一个第 种的血瓶。 - 如果
,则 上有一个第 种的红宝石。 - 如果
,则 上有一个第 种的蓝宝石。 - 如果
,则 上有一个第 种的绿宝石。 - 如果
,则 上有一只第 种的怪物。
接下来一行九个整数
接下来一行九个整数
不保证输入中的所有宝物和怪物都会在地图中出现,但是保证地图上至少有一只怪物。
请注意比赛中途提交上去后,对于每个测试点如果有分就会显示该测试点满分,比赛完后会进行重测给出真实的分数,请特别注意!
输出格式
针对给定的 10 个输入文件 tower1.in ~ tower10.in,你需要分别提交你的输出文件 tower1.out ~ tower10.out。
第一行一个整数
接下来
如果最后不在目标状态的位置,玩家的人物会自动走到目标状态的位置。同样,如果不是空地则会触发事件,你需要保证从上次的位置能只经过空地格子走到目标状态位置。
请注意比赛中途提交上去后,对于每个测试点如果有分就会显示该测试点满分,比赛完后会进行重测给出真实的分数,请特别注意!(很重要所以说两遍)
样例一
input
4 5 0 1 2 1 2 0 3 50 20 0 0 0 60 22 1 0 0 70 25 1 0 0 0 0 0 0 0 1 1 503 1 1 301 501 0 502 201 1 1 0 1 1 4 3 200 10 10 0 0 0 0 1 3 1 12 12 0 0 0 0
output
5 3 2 3 1 3 4 3 5 2 3
explanation
这个样例玩家的玩法如下:
一开始的属性为
走到
走到
走到
走到
走到
最后走到
评分方式
对每组数据,我们设置了
如果你的输出不合法(如走到不能走到的格子上,或
如果最后玩家的人物在自动走到目标状态的位置的过程中出错,比如根本无法到达目标位置,被怪打死等,或者未能达到目标状态的其它参数要求,而其余部分均合法则得
否则,设你最后
- 若
,得 分, - 若
,得 分, - 若
,得 分, - 若
,得 分。
请注意比赛中途提交上去后,对于每个测试点如果有分就会显示该测试点满分,比赛完后会进行重测给出真实的分数,请特别注意!(很重要所以说三遍)
如何测试你的输出
在终端中先切换到该试题的目录下:(windows用户请使用cmd)(假设你把输入输出文件、checker什么的都放在了tower这个文件夹下)
cd tower
我们提供checker这个工具来测试你的输出文件是否是可接受的。使用这个工具的方法是,在终端中运行
./checker_linux64 <case_no>
其中case_no
是测试数据的编号。例如
./checker_linux64 3
将测试tower3.out是否可以接受。(windows用户请使用checker_win32 3
)(什么你是windows 64位?放心吧可以运行win32应用程序的。)
当然我们有对应的linux 32位版本:checker_linux32
。如果linux用户发现无法运行程序,请尝试执行chmod +x checker_linux64
或chmod +x checker_linux32
后重试。
其它操作系统请安装 node.js 然后使用 node checker.js <case_no>
运行checker。
在你调用这个程序后,checker将根据你给出的输出文件给出测试的结果。
windows小白特别篇
首先你要下载数据和checker并解压,放在某个文件夹下。比如 D:\wahaha\tower。
然后你需要打开 cmd。如果是XP,点击开始,运行,然后打 cmd 三个字,然后确定,cmd 就出来了。如果是其它的 windows,实在找不到就用windows的搜索功能找,还找不到就上网搜一下“cmd在哪里”。
好,打开了之后默认位置应该在 C 盘,如果你下载的数据和checker放在了C盘那不要紧,如果放在了D盘请在cmd中输入
D:
然后回车,来切换所在盘。
然后再 cd D:\wahaha\tower
来切换所在目录。
接下来的事情就如前所述了。
听说有人用记事本打开输入文件后发现是一堆乱码?由于linux下换行符跟windows下不同,请使用其它编辑器,比如GUIDE、Dev-C++、写字板、vim、Emacs等打开。
linux小白特别篇
感觉应该没有不会用终端的linux选手。
linux的文件分为可读,可写,可执行三种,下载下来的文件一般并不是可执行的,这就是为什么之前我们要 chmod +x checker_linux64
,这是赋予这个文件可执行的权限。请注意这只是赋予可执行权限而不是执行这个文件,不要搞错意思了。
然后就可以开心地玩耍啦!
我还是不会用!
参见 FAQ 里我们的联系方式。
请注意比赛中途提交上去后,对于每个测试点如果有分就会显示该测试点满分,比赛完后会进行重测给出真实的分数,请特别注意!(我写了四遍,如果你还看不见我就给你跪了)
来源
UOJ Goodbye Jiawu