#159. 打牌
打牌
打牌
题目背景
比赛开始前,几位同学围在一起讨论扑克牌游戏。
为了避免规则太复杂,大家约定只考虑牌的点数,不考虑花色,并且只允许三种出法。现在给你若干手牌,请判断每一手牌能否在不超过两次出牌内出完。如果可以,你还需要输出任意一种合法方案。
本题采用 Special Judge,合法方案不唯一。
题目描述
一副牌共有 种点数,按从小到大的顺序依次为:
2 3 4 5 6 7 8 9 T J Q K A
其中 T 表示点数 。每种点数最多出现 次。
一次合法出牌必须是以下三种牌型之一:
- 顺子:至少 张牌,所有点数互不相同,并且在上面的顺序中连续递增。顺子不能循环,例如
Q K A合法,但A 2 3和A 2 3 4 5都不合法。 - 三带二:恰好 张牌,其中一种点数出现 次,另一种不同点数出现 次。
- 四带一一:恰好 张牌,其中一种点数出现 次,另外两张牌的点数互不相同,并且都不同于这 张牌的点数。
不能出单张、对子、三张、四张,也不能使用题目没有列出的其他牌型。
给定 组手牌。对于每组手牌,请判断是否可以用不超过两次合法出牌把所有牌全部出完。如果可以,输出任意一种合法方案。
输入格式
第一行包含一个整数 ,表示测试组数。
接下来每组测试数据包含两行:
- 第一行包含一个整数 ,表示这一手牌的数量。
- 第二行包含 个字符串,表示每张牌的点数。每个字符串一定是
2 3 4 5 6 7 8 9 T J Q K A中的一个。
输出格式
请依次输出每组测试数据的答案,不需要输出测试组编号。
对于每组测试数据:
- 如果无法用不超过两次合法出牌把所有牌出完,输出一行
No。 - 否则,先输出一行
Yes,再输出一行整数 ,表示出牌次数,要求 。接下来输出 行,每行描述一次出牌。
一次出牌的格式必须为以下三种之一:
S len p1 p2 ... plen:表示出一个长度为len的顺子,其中len >= 3,且p1,p2,...,plen必须是在规定顺序中连续递增的点数。T a b:表示出三带二,其中点数a出现 次,点数b出现 次,且a与b不同。F a b c:表示出四带一一,其中点数a出现 次,点数b和c各出现 次,且a,b,c两两不同。
你输出的所有出牌必须刚好用完该组输入中的所有牌,不能多用或少用。
样例输入
3
8
2 3 4 5 5 5 9 9
5
A 2 3 4 5
6
6 6 6 6 2 3
样例输出
Yes
2
S 3 2 3 4
T 5 9
No
Yes
1
F 6 2 3
样例解释
第一组可以先出顺子 2 3 4,再出三带二 5 5 5 9 9。
第二组虽然形如 A 2 3 4 5,但本题中的顺子不能循环,所以无法一手出完,也不能拆成不超过两手合法牌型。
第三组可以直接出四带一一。
数据范围
对于所有测试数据,满足:
- ;
- ;
- 每张牌的点数合法;
- 每种点数最多出现 次。
子任务
| 测试点编号 | 分数 | 特殊性质 1 | 特殊性质 2 |
|---|---|---|---|
| 数据一定有解,且存在一次出完的方式 | |||
| 数据一定有解,且存在只用顺子就出完的方式 | |||
| 数据一定有解,且存在只用三带二就出完的方式 | |||
| 数据一定有解,且存在只用四带一一就出完的方式 | |||
| 数据一定有解,且存在不用顺子就出完的方式 | |||
| 数据一定有解,且存在不用三带二就出完的方式 | |||
| 数据一定有解,且存在不用四带一一就出完的方式 | |||
| 无 | |||