该游戏由四名玩家进行,每名玩家控制一组 4 个颜色分别为黄色、绿色、红色和蓝色的棋子,代表飞机。最初,四个棋子面朝上放置在各自颜色的机库(Hanger)区域。
游戏按黄色、绿色、红色、蓝色的顺序轮流掷骰子。规则如下(Hanger/Launch Area/Final Stretch/Jump Point/Home base 请参考图片标记):
行动规则:如果骰子点数为 $x$,玩家可以将机库外的一个棋子移动 $x$ 步,或者如果 $x = 6$,则将一个棋子从机库移至起飞区(Launch)。如果所有四个棋子都在机库中且 $x = 6$,则跳过该轮。棋子从起飞区出发,沿棋盘顺时针移动,直到到达终点直道(Final Stretch),此时应用终点直道规则。
终点直道规则:当玩家的棋子到达其自身颜色的终点直道时,移动方向将改变,朝向其大本营(Home base)。如果一个棋子恰好落在终点直道的最内侧格子上,它将面朝下返回机库,作为完成的标志。如果骰子点数过大,无法恰好落在最内侧格子上,则必须沿终点直道向后移动剩余步数。
结束条件:第一个将所有四个棋子面朝下放入机库的玩家获胜,游戏结束。
怜悯规则:为了增加游戏趣味性,应用怜悯规则:如果某人连续 10 轮被跳过,则在跳过第 10 轮后,一个棋子将移动到起飞区。注意,这个在起飞区的棋子在下一轮总是可以移动,因此跳过连胜将被怜悯规则终止,这意味着在起飞后,连胜将变为 0。
奖励回合规则:掷出 6 的玩家将获得一个奖励回合。根据行动规则采取行动后,玩家将进行一个额外的奖励回合。玩家可以在之前的奖励回合中再次获得奖励回合——运气足够好的话,可以无限次进行奖励回合,直到游戏结束。
连击规则:当一个棋子即将落在终点直道之外的自身颜色格子上时,会发生连击,棋子向前移动四步,并落在下一个相同颜色的格子上。一轮中连击不能引发另一次连击。
捷径规则:当一个棋子即将落在自身颜色的跳跃点(Jump Point)上时,玩家沿捷径(虚线所示)跳跃到棋盘对面的格子上。注意,一次捷径旅程中只会发生一次连击:如果连击发生在捷径之前,棋子将停在捷径末端;否则,连击将发生在捷径之后。
堆叠规则:在连击和捷径结算后,如果一个棋子落在起飞区外已经有同色棋子的格子上,这些棋子将堆叠在一起。堆叠的棋子将作为一个整体一起移动。
保护规则:棋子在自身颜色的终点直道(包括最外侧格子)上受到保护。
战斗规则:在连击和捷径结算后,如果一个棋子移动后落在有对手棋子的格子上,除非一方受到保护,否则会发生战斗。当玩家 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. 游戏棋盘示意图