loj#P3843. 「PA 2018」Gra
「PA 2018」Gra
题目描述
现在已经是周末了!你终于可以放松一下,玩你最喜欢的策略游戏了。这个游戏的目标是收集地图上的所有金币并将它们运回基地,规则如下:
- 地图由一个 的网格构成。行从上到下编号为 到 ,列从左到右编号为 到 。我们用 表示第 行第 列的单元格。两单元格相邻当且仅当它们共享同一条边。
- 你的基地位于单元格 ,它位于左上角。你可以在那里招募新的角色,并且你必须把收集到的金币带到那里。剩下的 个格子中初始要么有一定数量的金币,要么有一定数量的石头。
- 游戏中有两种可以在地图上移动的角色:农民可以收集金币,但不可以进入有石头的单元格,坦克可以清除石头,并且可以进入任何种类的单元格。
- 游戏分轮次进行。每轮每个角色可以至多移动一次,移动到与它所在的单元格相邻的单元格中。两个角色不能在同一时间处于同一单元格中。所有移动都是瞬时的(移动花费的时间为零)。
- 如果在一轮结束时,农民位于有金币的单元格中,他就会拿走 枚金币并放到自己的背包里。如果单元格中的金币少于 枚,他就会全部拿走。农民的背包容量无限。但农民无法进入石头量不为 的单元格中。如果在一轮结束时农民回到了基地,他就会把背包里所有的金币放回基地。
- 如果在一轮结束时,坦克位于有石头的单元格中,它就会清除单元格中的 个石头(如果少于 个则清除全部)。
- 最初基地中有 枚金币。每买一种角色——农民或者坦克——都要花费 金币(买之前在基地中必须至少有这么多金币),买后角色即时出现。所以新角色可以在同一轮移动。
你的任务是,对于每一个输入给定的地图(也就是对于每个测试点),找到一个操作序列,使得按这个操作序列进行游戏后,所有地图上的金币都被运回了基地(并且可能部分或全部花掉了)。换句话说,结束后的地图上,任何单元格中都没有金币,任何农民的背包里也没有金币。命令如下表所示:
命令 | 效果 |
---|---|
买一个农民角色,并出生在基地中 | |
买一个坦克角色,并出生在基地中 | |
将一个角色从 移动到相邻的格子 中 | |
结束这轮 | |
结束游戏(即目前的这个测试点) |
你的程序会使用组织者准备的测试数据进行测试,每组测试数据由一定数量的地图——也就是测试点组成。每组测试数据都有一个限制 (请参考「数据范围及限制」一节)。这是对于每组数据平均轮数的限制。换句话说,如果测试数据中有 张地图,你的程序必须在最多 轮结束所有游戏。我们定义每个测试点的轮数为使用命令 的次数加 。
错误的命令,超出轮数限制或没有达成目标,均会被判为 Wrong Answer。
输入格式
第一行包含两个整数 ,表示测试点个数和平均轮数限制。除了样例外所有测试数据都有 。
对于每组数据,第一行一个正整数 。除了样例外所有测试数据都有 。
接下来 行,每行 个整数。 表示基地(一定位于左上角)。正数 意味着这个单元格有 枚金币,负数 意味着这个单元格有 个石头。
地图按如下方式生成:对于每组测试数据,组织者会选择一个常数 ,表示单元格中有石头的概率。对于每个除基地以外的单元格,随机选择一个在 到 范围内的整数 ,然后将 赋给这个单元格。在此之后,以 的概率给这个值乘以 。
输出格式
对于每组测试点,输出操作序列。一条命令输出一行。最多输出 条命令。
2 12
3
0 -8 -512
-16 -1 -128
8 -2 -512
3
0 64 -1
64 -1 -1
1 -1 -1
R TANK
M 0 0 1 0
=
=
M 1 0 1 1
R FARMER
M 0 0 1 0
=
M 1 0 2 0
=
M 2 0 1 0
=
M 1 0 0 0
=
===
R FARMER
M 0 0 0 1
R FARMER
M 0 0 1 0
=
=
=
=
M 0 1 0 0
=
M 0 0 0 1
=
=
M 1 0 2 0
=
M 2 0 1 0
=
M 1 0 0 0
=
M 0 0 1 0
=
R FARMER
M 1 0 2 0
M 0 0 1 0
M 0 1 0 0
=
===
数据范围与提示
共有十个子任务,每个子任务包含 到 个测试数据。确切的 值和 值如下表所示:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
请注意样例和测试数据在地图大小和测试点个数上稍有不同。