U451095 扑克牌游戏

题目背景

**10k+恐怖码量警告!作者写了4k+刚写完读入和预处理!** **本题连作者都不想写了。有想挑战的大佬可以来提交。** Poker!Game! Is! My! Favourite! Game! ——[2]() [2]():下面就是我玩扑克牌时灵光乍现想出的“小”模拟题。 [q]():让我看看! ~~其实本来还想加大小王和“不给风”的,但是由于觉得不太好写,就给删了。~~

题目描述

给定四个人 $A\space B\space C\space D$ 的牌,求按照如下方式出牌,那么这些牌将会如何出?其中的牌为一副标准扑克牌除去大小王。 ### 规则: 1. 四最小,三最大。故牌从小到大排序为 `4 5 6 7 8 9 10 J Q K 1 2 3`。其中 `J` `Q` `K` 均为大写字母。 2. 四个人轮流出牌。如果某一方不出,那么按照 `ABCD ABCD...` 的顺序顺延。 3. “对”为两个同数的牌(如 `99`),“顺子”为形同 `456` 这样的牌,“炸”为三个同数的牌(如 `666`),轰为四个同数的牌(如 `8888`)。 4. 顺子之中按照最小的牌定大小,注意 `123` 最小,`QK1` 最大。顺子中尾牌最大到 `1`(例如最长的顺子为 `1 2 3 4 5 6 7 8 9 10 J Q K 1`,不存在以 `2` 结尾的顺子)。 5. “炸”、“轰”能管任何小于当前层级的牌。层级为:其他牌 < 炸 < 轰。 6. “炸”、“轰”都是按照数定大小,但和顺子有所不同的是,`444` 最小,`333` 最大。 ### 整理牌 1. 优先找“轰”。 2. 第二优先找“炸”。 3. 第三优先找“顺子”。“顺子”找的越长越好。 4. 第四优先找“对”。 5. 最后找单牌。 ### 出牌: 题目**会**给定第一个出牌的人。出牌优先级和下面序号排序相同。如果没有人能管住自己的牌,那么下一轮仍旧按照优先级出牌。一个人出完牌后下一个人“借风”,按照自己的优先级出牌。 1. 首先,有同长度“顺子”就出同长度“顺子”,要求顺子优先保证最小,其次保证最长。如果没有“顺子”可以管,那么用“炸”管上,其次用“轰”管。 2. 其次,有“对”就出“对”,要求从最小的“对”出起。如果没有“对”可以管,那么用“炸”管上,然后用“轰”管。 3. 然后出单张的牌,从最小的单张开始出起。如果没有单张的可以管,那么拆开“轰”(如 `8888` 变为 `8` 和 `888` 并打出 `8`)。其次如果有拆完能够**继续形成“顺子”** 的“顺子”就拆它(如要管上 `6`,拆 `4 5 6 7 8 9 10` 变为 `4 5 6` 和 `8 9 10` 并打出 `7`)。 >默认**拆最长**(第二优先级拆最小)的顺子。优先保证拆完还是顺子,且拆出来的单牌尽量接近被管的牌。如果拆不成两个顺子就拆成一个;如果拆完了一个都剩不了就拆出最接近被管的牌的单牌(这里 a 能管 b 当且仅当 a 的权大于 b)。 再其次拆开“炸”(方式同“轰”),最后拆“对”。 4. 最后,如果除了“炸”和“轰”以外没得可出了,先出“炸”,再出“轰”。 5. 如果没得可出了,输出一行 `i Player Jump` 跳过这一轮。 所有管牌都要用**能管的最小的**管。例如自己有 `567` 和 `789` 两个“顺子”,对方出了 `456`,那么优先使用 `567` 来管。

输入格式

前 $4$ 行每行读入 $13$ 张牌(只含 `1 2 3 4 5 6 7 8 9 10 J Q K` 几种),中间以空格隔开,分别表示 $A\space B\space C\space D$ 四个人手里的牌。 最后一行一个字符,表示某个人先出。保证只为 `A` `B` `C` `D` 其中之一。

输出格式

输出若干行。 >首先分类讨论,如果一个人的牌出完了,那么输出格式如下: >>``Go %c %num``,其中 ``%c`` 表示这个人的名字,``%num`` 表示这是第几个出完牌的人。示例:``Go B 2``。 > >如果一个人没牌出了,那么输出格式如下: > >>`%c Player Jum`,其中 `%c` 表示这个人的名字。示例:`C Player Jump`。 > >如果不是,那么这行先输出一个数 $i$ 表示这是第 $i$ 轮出牌。 之后,**输出空格后**输出一个字符(`A`、`B`、`C` 或 `D`),表示这是某个人出的牌。 之后,**输出空格后**输出这个人这一轮打出的牌。每张牌之间用空格隔开。 所有人都出完牌后,牌局结束,输出 `End`。