SP8846 MAHJONG - Fudan Extracurricular Lives
题目描述
# 题目背景
复旦大学的学生有着丰富多彩的课外生活。众所周知,张江校区的许多学生更喜欢"拖拉机"(一种四人扑克游戏,也称为“80分”或“升级”),但有相当多的学生(尤其是计算机科学系)喜欢另一种四人游戏:麻将。麻将是中国历史最悠久的多人游戏之一。不同省份的人们都喜欢这款游戏,并分别指定了各种规则。
开始这个问题,首先,我们要介绍一些关于游戏的基本概念:
## 游戏进行中
最初,所有的麻将洗牌后面朝下放置。之后,玩家每人获得13张牌作为手牌。当轮到某玩家时,可以从牌堆中拿一张牌并与手牌交换,之后便是下一位玩家。直到牌堆中没有牌或任何玩家胜利。
## 手牌(持有牌)
游戏过程中,玩家应该管理自己的牌组;这些牌组分别为每个玩家的持有牌。玩家的每个持有牌有两种类型:公开和隐藏。公开的牌是公开显示的(明牌),而隐藏的牌是保密的,玩家可以知道所有玩家的公开牌,但只能知道自己的隐藏牌。隐藏牌进行明牌的条件后面进行说明。
## 胜利
一个玩家的手牌可以经过特定划分,变成由顺子、刻字、对子组成,如果手牌与目标牌一致,那么玩家便赢得比赛
## 分数
在一个玩家获胜之后,分数根据评分规则系统来判断——众所周知,麻将最初是被邀请参加赌博的。
这里规则采用四川麻将的规则:
## 麻将简述
在中国麻将的原始规则中,游戏以大量的牌为基础,可以分为字牌(东、南、西、北、中、发、白七种)和序数牌(条子、饼子、万子三种花色,每种花色各有1到9的九种牌),每种牌各四张,共108张。一般来说,牌的种类有两个基本信息:花色和号码,因此我们可以根据牌的号码和花色的顺序来命名牌,例如:一饼。当然,人们也习惯的称“一条”为“幺鸡”。
## 两套限制
这个限制了一个人的手牌最多允许有**两个花色**,也就是说,手牌中有三个花色的不能赢得比赛(实际上,会导致一些惩罚)。
在每个玩家抽牌、出牌的过程中,有一些导致中断的情况。下面进行说明:
## 吃、碰、杠
玩家可以进行**吃**和**碰**,玩家可以吃上家的牌,但可以碰所有人的牌,碰的优先级高于吃。对于玩家出了(或自己抽到)自己刻子的牌,可以进行**杠**,通常自己抽到后,也可以对自己的碰牌进行杠。
吃、碰、杠的牌都变为公开牌。
## 和牌
玩家出牌(或自己抽到)的牌是自己的听牌时,此时玩家可以和牌,当然和牌要满足一定要求:
1. 符合“两套限制”
2. 手牌以下两种样式中的一个:
- **由四个顺子(或刻子)和一个对子组成**。此样式为常规役
- **由七个对子组成**。
由于每个玩家只有13张牌,所以需要一张等待牌来和牌。**注意,如果对于一种等待牌,你的手牌中已经全部拥有(即拥有4张),那么你不可以把它作为你的等待牌**
## 计分
现在我们来明确一下计分规则:一旦玩家达到目标架构(已经获得胜利),他或她的基本分数为1,即最低分数为1。此外,还有很多特定条件可以进一步奖励额外分数。请参阅以下说明:
- 杠
如果玩家在他或她的手牌中收集了所有四张相同类型的牌,那么我们说这种牌为杠。每条杠会给1分。**注意,除了公开牌中的杠,隐藏牌中的四张一样的牌也是杠**
- 暗七对
如果手牌符合第二种样式,则给玩家加2分。
- 清一色
如果一名玩家所有的手牌(包括隐藏牌和公开牌)都具有相同的花色,那么额外获得2分。
- 对子胡
条件是手牌都是对子,则给玩家1分。
- 带幺九
这是四川麻将中一个令人困惑的规则,即使不是所有的四川玩家都承认这种情况,但在这个问题中我们将其考虑在内。
不管手牌是什么样式,带幺九的条件是要求每个顺子、刻子和对子**都至少**有一个1或9,则给玩家2分。
- 将对
将对是对子胡的一种特殊风格。将对是全由2、5、8组成的大对子。将对比普通对子胡多2分。
- 还有一些与计分相关的项目,但不在本问题中考虑。
对于分数的判断,我们需要注意一个问题。
隐藏牌是(在这个例子中没有公开牌):

这样,我们可以判断得分为1(基本)+ 2(七对)+ 2(天地相关)= 5?答案是不对的。为了解释这个悖论,请提醒自己注意胜利的定义:玩家获得胜利意味着他可以将持有牌分成获胜的牌型,我们计算分数的时候,只判断一种分法。在这个问题中我们选择所有分发中分数较高的一个。
你的任务是:给定一个玩家的手牌,请确定该玩家的所有等待牌(如果存在)及其对应的分数。
输入格式
输入文件的第一行是整数 $T$($T
输出格式
对于每个case,首先输出一行包含从1开始计数的case number。然后,如果没有等待牌,则输出一行包含“NONE”的字符串(为清晰起见); 否则,输出所有玩家的等待牌,然后在每个等待牌后输出它们对应的分数,用冒号“:”和空格隔开。 所有等待牌各一行。 任何多余的空白(空格或空行)都会导致“WA”。 输出的等待牌这样排序:先按牌种排序,先是 $D$,最后是 $B$ 和 $M$; 再按数字排序,数字越小优先级越高。
# 输入输出样例
### 输入 \#1
```
7
8D8D8D5D2D2D2D 6D6D6D7D7D7D
8D8D8D5D2D2D2D6D6D6D7D7D7D NONE
1D1D1D1D 3D3D3D4D4D4D5D5D5D
2D2D2D5D5D5D2M2M2M5M5M8M8M NONE
1D1D1D1D2D2D2D2D3D3D3D3D9M NONE
1D1D1D1D9D9D9D9D1M1M1M1M9M NONE
2D2D3D3D4D5D5D6D6D7D7D8D8D NONE
```
### 输出 \#1
```
Case #1:
5D: 4
Case #2:
4D: 3
5D: 4
6D: 4
7D: 4
8D: 4
Case #3:
NONE
Case #4:
5M: 4
8M: 4
Case #5:
9M: 6
Case #6:
9M: 8
Case #7:
1D: 3
4D: 5
```
说明/提示
考虑样本输入的第三种情况,似乎添加一个$1D$可以构建获胜样式,但是,牌堆中并不存在另一个$1D$。
by LingChen