QOJ.ac

QOJ

时间限制: 1 s 内存限制: 512 MB 总分: 100

#4597. 雷霆崖

统计

该游戏由四名玩家进行,每名玩家控制一组 4 个颜色分别为黄色、绿色、红色和蓝色的棋子,代表飞机。最初,四个棋子面朝上放置在各自颜色的机库(Hanger)区域。

游戏按黄色、绿色、红色、蓝色的顺序轮流掷骰子。规则如下(Hanger/Launch Area/Final Stretch/Jump Point/Home base 请参考图片标记):

  1. 行动规则:如果骰子点数为 $x$,玩家可以将机库外的一个棋子移动 $x$ 步,或者如果 $x = 6$,则将一个棋子从机库移至起飞区(Launch)。如果所有四个棋子都在机库中且 $x = 6$,则跳过该轮。棋子从起飞区出发,沿棋盘顺时针移动,直到到达终点直道(Final Stretch),此时应用终点直道规则。

  2. 终点直道规则:当玩家的棋子到达其自身颜色的终点直道时,移动方向将改变,朝向其大本营(Home base)。如果一个棋子恰好落在终点直道的最内侧格子上,它将面朝下返回机库,作为完成的标志。如果骰子点数过大,无法恰好落在最内侧格子上,则必须沿终点直道向后移动剩余步数。

  3. 结束条件:第一个将所有四个棋子面朝下放入机库的玩家获胜,游戏结束。

  4. 怜悯规则:为了增加游戏趣味性,应用怜悯规则:如果某人连续 10 轮被跳过,则在跳过第 10 轮后,一个棋子将移动到起飞区。注意,这个在起飞区的棋子在下一轮总是可以移动,因此跳过连胜将被怜悯规则终止,这意味着在起飞后,连胜将变为 0。

  5. 奖励回合规则:掷出 6 的玩家将获得一个奖励回合。根据行动规则采取行动后,玩家将进行一个额外的奖励回合。玩家可以在之前的奖励回合中再次获得奖励回合——运气足够好的话,可以无限次进行奖励回合,直到游戏结束。

  6. 连击规则:当一个棋子即将落在终点直道之外的自身颜色格子上时,会发生连击,棋子向前移动四步,并落在下一个相同颜色的格子上。一轮中连击不能引发另一次连击。

  7. 捷径规则:当一个棋子即将落在自身颜色的跳跃点(Jump Point)上时,玩家沿捷径(虚线所示)跳跃到棋盘对面的格子上。注意,一次捷径旅程中只会发生一次连击:如果连击发生在捷径之前,棋子将停在捷径末端;否则,连击将发生在捷径之后。

  8. 堆叠规则:在连击和捷径结算后,如果一个棋子落在起飞区外已经有同色棋子的格子上,这些棋子将堆叠在一起。堆叠的棋子将作为一个整体一起移动。

  9. 保护规则:棋子在自身颜色的终点直道(包括最外侧格子)上受到保护。

  10. 战斗规则:在连击和捷径结算后,如果一个棋子移动后落在有对手棋子的格子上,除非一方受到保护,否则会发生战斗。当玩家 A(攻击者)的棋子到达该格子,且该格子原本有玩家 D(防守者)的 $d$ 个棋子时,玩家 A 的 $\min(a, d - 1)$ 个棋子和玩家 D 的 $\min(a, d)$ 个棋子将被击落并送回各自的机库,且面朝上。

此外,该游戏包含一套计分系统,规则如下: 1. 初始时每位玩家得分为 0。 2. 当玩家的棋子到达大本营时,获得 $5x$ 分($x$ 为其他玩家尚未到达大本营的棋子总数)。 3. 当玩家 A 和 B 发生战斗,A 为攻击者,B 为防守者,如果玩家 A 的 $a$ 个棋子和玩家 B 的 $b$ 个棋子被击落并送回机库,则 A 获得 $5b$ 分,B 获得 $2a$ 分。 4. 对于每位玩家,如果掷出数字 $x$ 连续 $y$ 次,则获得 $(6 - x) * (y - 1)^2$ 分。此处仅奖励最大连续相同掷骰次数。形式上,假设玩家在第 $i$ 次到第 $(i+k)$ 次掷骰中掷出 $x$,则当且仅当以下条件满足时,获得 $(6 - x) * k^2$ 分:1. $i = 1$ 或第 $(i-1)$ 次掷骰不是 $x$;2. 第 $(i+k+1)$ 次掷骰不存在(游戏在之前结束)或第 $(i+k+1)$ 次掷骰不是 $x$。 5. 获胜者额外获得 50 分。

现在 Alice、Bob、Carol 和 David 正在玩这个游戏。他们的颜色分别是黄色、绿色、红色和蓝色。玩家们有一个共同点:如果他们掷出 6 且机库中有面朝上的棋子,他们会选择将棋子起飞,而不是将机库外的棋子移出。除此之外,如果存在多种移动选择,每位玩家都有自己的策略:

Alice 总是选择能最大化堆叠棋子数量的移动(即最大化 Alice 在起始格和落点格上的棋子总数,不考虑移动后的战斗)。如果仍有多种选择,Alice 会选择移动距离大本营最近的棋子。

Bob 具有攻击性且渴望与其他玩家战斗,因此他总是选择通过击落其他玩家棋子来获得最高分数的移动。如果仍有多种选择,Bob 会选择移动距离大本营最近的棋子。

Carol 希望他的棋子移动得尽可能快,因此他总是选择能最大化起始格与落点格之间距离的移动(在某些特殊情况下,该距离可能是负数或零)。如果仍有多种选择,Carol 会选择移动距离大本营最近的棋子。

David 不想使用任何复杂的策略,总是选择移动距离起飞区最近的棋子(即当前格子与大本营之间的最大距离)。

此处我们将“距离大本营最近”定义为当前格子与相应大本营之间的格子数最少,不考虑跳跃。

现在给出每次掷骰的结果,请预测游戏的获胜者及每位玩家的最终得分。

为了避免输入过大,给出四个秘密参数 $x, y, z, w$,每次掷骰的结果由以下代码生成:

uint32_t x , y , z , w;
uint32_t Xor128 () {
uint32_t t ;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ ( t ^ (t >> 8));
}
int GetDice () {
return Xor128 () % 6 + 1;
}

注意:本题描述的规则与现实世界中的飞行棋规则有所不同,请仔细阅读上述规则。

输入格式

输入包含多个测试用例。 第一行包含一个整数 $T$ ($1 \le T \le 50$),表示测试用例的数量。 每个测试用例包含一行,包含四个整数 $x, y, z, w$ ($0 \le x, y, z, w \le 2^{32} - 1$)。 保证根据规则和数据,游戏将在有限轮次内结束。

输出格式

对于每个测试用例,输出五行: 第一行显示获胜者,格式为 "NAME win!"。("NAME" 替换为 "Alice"、"Bob"、"Carol" 或 "David")。 接下来的四行显示每位玩家的最终得分,格式为 "NAME: score",按得分从高到低排序。如果两名玩家得分相同,则名字字典序较小的玩家优先输出。

样例

输入 1

1
1 1 1 1

输出 1

Bob win!
Bob: 269
Alice: 213
Carol: 118
David: 99

Figure 1. 游戏棋盘示意图

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.