问题1183--桥牌

1183: 桥牌

[命题人 : ]
时间限制 : 1.000 sec  内存限制 : 128 MB

题目描述

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

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

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

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

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

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

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

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

1、 定约的基本分

a)       对于无将定约,第1阶记40分,每提高一阶加30

b)       对于黑桃与红心定约,每阶30

c)        对于方片与草花定约,每阶20

若定约被加倍,则基本分为原来的两倍;再加倍则为原来的4

2、 若基本分达到100分,则称为“成局”。若定约达到6阶,则称为“小满贯”。若定约达到7阶,则称为“大满贯”。完成定约时,根据定约种类,获得额外奖分:

a)       未成局定约,奖50

b)       成局而未满贯的定约,奖300

c)        小满贯定约,奖500

d)       大满贯定约,奖1000

若完成的定约为加倍定约,则再额外奖50分;为再加倍定约,则额外奖100分。

3、 赢得超过定约要求的墩,根据定约种类,获得额外奖分:

a)       未加倍定约,则与1中计算方式相同(NTHS定约下一墩30分,DC定约下一墩20分)

b)       加倍定约,每墩100

c)        再加倍定约,每墩200

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

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

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

输入

输入包含多行。

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

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

输出

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

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

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

样例输入 Copy

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

样例输出 Copy

NS:5SX
-300

提示

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

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

来源/分类