#P1183. 桥牌

桥牌

问题描述

Miaoyao 最近迷上了桥牌。桥牌是一种竞技性极强的四人牌类游戏。一桌桥牌中,参与游戏的四名玩家分别记作东、南、西、北四家,相对而坐的两家为搭档。不同于其他牌类游戏,桥牌在开始打牌之前有一个“叫牌”的过程,即游戏双方按照一定的方式约定本局的游戏规则与目标,即达成“定约”。叫牌阶段的博弈为桥牌赋予了无穷的魅力。

具体来说,叫牌需要约定“阶数”和“将牌”两个要素。

在打牌阶段中,一共会产生 1313 墩牌,每一墩牌要么被南北一方赢得,要么被东西一方赢得。一个 kk 阶(1k71 \leq k \leq 7)的定约,要求获得定约的一方在游戏过程中赢得至少 k+6k + 6 墩牌。例如,若最终达成的定约为东西方的 22 阶定约,则东西方至少要赢得 88 墩牌才能得分,否则将被扣分。恰好达成定约记作 "Make",若超额达成,超出 xx 墩就记作 "+x+x",若未能达成,则缺少 xx 墩就称为“宕 xx",记作 "x-x"。

“将牌”指的是双方在叫牌阶段约定一种花色,在打牌过程中这一花色的牌将被赋予特殊含义,当然也可约定不设将牌。在桥牌中,四种花色是有高低之分的,从低到高依次为草花(Club,记作 C)、方片(Diamond,记作 D)、红心(Heart,记作 H)、黑桃(Spade,记作 S)。不设将牌称为无将(No Trump,记作 NT),无将高于花色将牌。叫牌时,应同时给出定约的阶数与将牌。例如,“一阶定约,以草花为将牌”(记作 1C),“七阶定约,不设将牌”(记作 7NT)。

叫牌阶段,由某一家开始(本题中约定由北家开始叫牌),按顺时针方向,依次给出自己想要的定约(或者不叫,记作“-”)。值得注意的是,任何时候叫出的定约,都需要比之前一个定约更高。所谓的更高,指的是阶数更高,或者阶数相同、花色更高。例如,1NT 高于 1H,2C 高于 1NT。如果在某一家叫牌后,连续三家都不叫,则叫牌结束,以该定约为最终叫牌结果。

叫牌过程中,如果认定对方无法完成定约,可以叫出“加倍”(记作 X),意为放大最终的得分与失分。同样,针对对方的加倍,可以叫出“再加倍”(记作 XX),意为继续放大最终的得分与失分。加倍与再加倍同样需要接下来三家都不叫表示同意才能生效,若接下来有一家给出新的定约,则之前叫出的加倍不再起效。

特别地,如果没有人给出叫品,即四家都不叫,则游戏重新开始。

一局桥牌中定约方的得分与叫牌密切相关。若达成定约,则最终得分由以下部分组成:

  1. 定约的基本分
    a) 对于无将定约,第 11 阶记 4040 分,每提高一阶加 3030
    b) 对于黑桃与红心定约,每阶 3030
    c) 对于方片与草花定约,每阶 2020
    若定约被加倍,则基本分为原来的两倍;再加倍则为原来的 44

  2. 若基本分达到 100100 分,则称为“成局”。若定约达到 66 阶,则称为“小满贯”。若定约达到 77 阶,则称为“大满贯”。完成定约时,根据定约种类,获得额外奖分:
    a) 未成局定约,奖 5050
    b) 成局而未满贯的定约,奖 300300
    c) 小满贯定约,奖 500500
    d) 大满贯定约,奖 10001000
    若完成的定约为加倍定约,则再额外奖 5050 分;为再加倍定约,则额外奖 100100 分。

  3. 赢得超过定约要求的墩,根据定约种类,获得额外奖分:
    a) 未加倍定约,则与 1 中计算方式相同(NT、H、S 定约下一墩 3030 分,D、C 定约下一墩 2020 分)
    b) 加倍定约,每墩 100100
    c) 再加倍定约,每墩 200200

当然,若未能达成定约,则以上得分均不会获得,同时还会被倒扣分。对于未加倍定约,每宕一墩罚 5050 分;对于加倍定约,所宕的第一墩罚 100100 分,第二、三墩每墩罚 200200 分,以后每墩罚 300300 分;对于再加倍定约,罚分是加倍定约的两倍。

(实际的桥牌记分规则还包含局况的影响,这里不作考虑)

Miaoyao 希望写一个程序来帮助他学习桥牌,但他实在是太菜了,只好向你求助了。你只需要完成其中一个小部分:给出叫牌过程与最终结果,求出最终达成的定约以及定约方的得分。如果叫牌过程中有错误(例如,叫出比之前更低阶的定约,加倍队友的定约,再加倍队友的加倍等等)或打牌结果有错误(例如,七阶定约结果为 +1+1),则输出“Error!”。如果四家均不叫,则输出 "Restart!"。(均不含引号)

输入格式

输入包含多行。

开始若干行,每行最多 44 个字符串,依次表示北、东、南、西四方在一轮中的叫牌。保证每个字符串为“-”、"X"、"XX" 中的一种,或者为“阶数+花色”的叫品。阶数范围在 11-77 之间,花色为 "C"、"D"、"H"、"S"、"NT" 中的一种。当开始叫牌时连续出现四次“-”,或已有叫牌后连续出现三次“-”,叫牌内容结束。

若叫牌未被重启,则接下来一行,一个字符串,表示打牌结果。

输出格式

若叫牌过程或打牌结果存在错误,则输出“Error!”。

若四家均不叫,则输出“Restart!”(桥牌中这种情况叫做 ALL PASS,即 - - - -,不过这里输出 Restart 就好)。

否则,输出两行:第一行为叫牌结果,格式为“定约方:定约(加倍情况)"。定约方即最终获得定约的一方,南北方使用 "NS" 表示,东西方使用 "EW" 表示。定约表示方式与叫牌过程一致。若达成的定约为加倍定约,则再输出一个 "X";为再加倍定约,则再输出一个“XX”。例如,东西方取得 33 阶无将牌定约,被加倍,则表示为“EW:3NTX”;南北方取得 66 阶方片将牌定约,被加倍后再加倍,则表示为“NS:6DXX”。第二行一个整数,表示定约方得分。

样例输入

2S 3H 4S 5H
5S X - -
-
-2

样例输出

NS:5SX
-300

提示

(同济桥牌社欢迎大家的加入——某位不愿意透露姓氏的姜姓学长)

(但是题目不是我出的,做不出来别找我——小姜)