蒜斜是个不折不扣的游戏狂魔。他的电脑上有$1000$款他最喜欢的游戏。每天早上起来,他会随机抽取两个$1$到$1000$之间的整数,第一个数表示他今天要玩的游戏,第二个数表示他要通关的次数。运气最差的一次是他抽到了“点一下玩一年”的传奇霸业,所幸的是第二个数只有$2$,不然他这辈子都通关不了。
今天蒜斜抽到的游戏是魔塔,这是一款很经典的游戏,但是他玩了半天连第$1$层都还没有通过。因此他求助北大算协的朋友把这个游戏放到了UOJ上 —— 不知道此时此刻的你能否帮他一把?
问题描述
这个魔塔游戏有 $100$ 层,每一层地图的结构都完全一样,如下图所示:
################# ##### Bb?Gr###### ##### ########### #?RbR GgR?B??#### ##### ########### #?GrG BGR?????### ##### ########### #?BgB G?G???Rb### ##### ########### # R RrG?B???Bg# # ? G ########### #P B?RRRGGGBBB@# #################
每一个字符都代表了地图中的一个元素,其中:
P
字符表示玩家的位置,每一层开始的时候,玩家都处在左下角的位置。#
表示墙壁,玩家移动的时候无法跨过墙壁。RGB
分别表示红色,绿色,蓝色的门,玩家必须要消耗相同颜色的钥匙才能打开对应的门。门被打开之后将会从地图上消失。rgb
分别表示红色,绿色,蓝色的钥匙,在到达钥匙所处在的格子后,玩家会自动捡起这把钥匙。钥匙被捡起后将会从地图上消失。?
是一把随机的钥匙,在到达 ? 所处在的格子之后,玩家将会获得一把随机颜色的钥匙,之后 ? 会从地图上消失。@
是终点,当玩家碰到终点的时候就会进入下一层。
在每一层游戏开始的时候,你身上没有任何钥匙。你的目标是到达字符 @
的位置从而进入下一层。
Small Task: 你需要达到游戏的第 $2$ 层。
Large Task: 你需要达到游戏的第 $100$ 层。
游戏文件
在本题最下方的下载链接中,你可以下载到魔塔游戏的可执行文件。请根据你电脑的系统挑选对应的可执行文件运行。
游戏开始时,你需要输入我们下发给你们队伍的随机种子,来表明解题人身份。如果你使用了别的随机种子,将会导致答案被判错或者比赛被判作弊。
UPD: 比赛结束了,你可以使用随机种子 $99565380$ 来做这个题。
在输入随机种子之后,游戏正式开始。游戏的界面如下图所示:
Level: 1 Answer to the small task: Unlock after reaching level 2. Answer to the large task: Unlock after reaching level 100. ################# ##### Bb?Gr###### ##### ########### #?RbR GgR?B??#### ##### ########### #?GrG BGR?????### ##### ########### #?BgB G?G???Rb### ##### ########### # R RrG?B???Bg# # ? G ########### #P B?RRRGGGBBB@# ################# You keep 0 red keys, 0 blue keys, 0 green keys Please enter your choice (move: WASD, restart: R):
每一步,你可以使用的操作有:
- 输入 WSAD 来上下左右移动玩家。移动的时候可能会发生的情况有
- 移动的目标位置是空地,则字符
P
会移动到目标位置。 - 移动的目标位置是一把钥匙,则钥匙会被捡起,同时
P
会移动到目标位置。 - 移动的目标位置是一扇门且你有对应颜色的钥匙,则门会被打开,你会消耗一把对应的颜色的钥匙且
P
会移动到目标位置。 - 移动的目标位置是墙壁或者一扇你没有对应颜色钥匙的门,则不会发生任何变化,
P
也不会发生改变。 - 移动的目标位置是
@
,则地图会被重置成初始的样子,且地图上方的 Level 数会增加一。
- 移动的目标位置是空地,则字符
- 输入 R 来重置当前层。此时地图会被重置成最开始样子,
?
钥匙也会被重新随机。按 R 不会重置楼层数,即在 Level 10 按下 R 重置之后玩家仍然处在 Level 10。
在玩家第一次到达 Level 2 的时候,游戏会在相同目录下自动生成文件 small.ans
;在玩家第一次达到 Level 100 的时候,会自动生成文件 large.ans
。提交 small.ans
可以获得 $35$ 分,提交 large.ans
可以获得 $100$ 分。注意,在提交的时候需要把对应的文件改名为 tower1.out
。
在游戏过程中,你最多只能进行 $10^5$ 步操作:即,向游戏输入的 WASDR
字符的总数不能超过 $10^5$。操作数大于这个上界的提交将会被视为错误,并无法得分。
其他补充信息
small.ans
和 large.ans
是在到达对应楼层的时刻生成的,且之后不会进行更新。因此在到达对应楼层之后强制让游戏退出并不会影响答案文件的生成。
游戏流程不会进行保存,因此如果游戏过程中断了,下一次运行的时候将从 Level 1 重新开始。
在某些系统上下发的程序可能不具有可执行权限,你可能需要用 chmod
指令来给出对应的权限。
请使用 MacOS 的同学尽量使用命令行来打开可执行文件,而不要双击打开。
如果你的电脑系统比较小众导致下发的所有可执行文件都无法正常运行,我们深表遗憾。在这种情况下,你可以使用阿里云等云服务器来获得可以运行这些可执行文件的环境。