【ProjectEuler】ProjectEuler_054(在扑克游戏中玩家1能赢多少局?)

// Poker hands
//     Problem 54
//     In the card game poker, a hand consists of five cards and are ranked, from lowest to highest, in the following way:
//
// High Card: Highest value card.
//     One Pair: Two cards of the same value.
//     Two Pairs: Two different pairs.
//     Three of a Kind: Three cards of the same value.
// Straight: All cards are consecutive values.
// Flush: All cards of the same suit.
//        Full House: Three of a kind and a pair.
//        Four of a Kind: Four cards of the same value.
//        Straight Flush: All cards are consecutive values of same suit.
//        Royal Flush: Ten, Jack, Queen, King, Ace, in same suit.
//        The cards are valued in the order:
// 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace.
//
//     If two players have the same ranked hands then the rank made up of the highest value wins; for example, a pair of eights beats a pair of fives (see example 1 below). But if two ranks tie, for example, both players have a pair of queens, then highest cards in each hand are compared (see example 4 below); if the highest cards tie then the next highest cards are compared, and so on.
//
//     Consider the following five hands dealt to two players:
//
// Hand	 	Player 1	 	Player 2	 	Winner
//     1	 	5H 5C 6S 7S KD
//     Pair of Fives
//     2C 3S 8S 8D TD
//     Pair of Eights
//     Player 2
//     2	 	5D 8C 9S JS AC
//     Highest card Ace
//     2C 5C 7D 8S QH
//     Highest card Queen
//     Player 1
//     3	 	2D 9C AS AH AC
//     Three Aces
//     3D 6D 7D TD QD
//     Flush with Diamonds
//     Player 2
//     4	 	4D 6S 9H QH QC
//     Pair of Queens
//     Highest card Nine
//     3D 6D 7H QD QS
//     Pair of Queens
//     Highest card Seven
//     Player 1
//     5	 	2H 2D 4C 4D 4S
//     Full House
//     With Three Fours
//     3C 3D 3S 9S 9D
//     Full House
//     with Three Threes
//     Player 1
//     The file, poker.txt, contains one-thousand random hands dealt to two players. Each line of the file contains ten cards (separated by a single space): the first five are Player 1's cards and the last five are Player 2's cards. You can assume that all hands are valid (no invalid characters or repeated cards), each player's hand is in no specific order, and in each hand there is a clear winner.
//
//     How many hands does Player 1 win?
//
// 题目54:在扑克游戏中玩家1能赢多少局?
// 在扑克游戏中,一局牌由五张牌组成,组成的牌的大小由低向高如下:
//
// High Card: 最高值的牌.
//     One Pair: 两张面值一样的牌.
//     Two Pairs: 两个值不同的One Pair.
//     Three of a Kind: 三张面值一样的牌.
// Straight: 所有的牌面值为连续数值.
// Flush: 所有的牌花色相同.
//        Full House: Three of a Kind 加一个One Pair.
//        Four of a Kind: 四张牌面值相同.
//        Straight Flush: 所有的牌花色相同并且为连续数值.
//        Royal Flush: 10,J,Q,K和A,并且为相同花色。
//        牌的面值大小排序如下:
//        2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace.
//
//        如果两个玩家的牌具有同样的排序(上面介绍的几种),那么他们牌的大小由手中最大的牌决定。例如,一对8比一对5大(见下面例一);但是如果两个玩家都用一对Q,那么他们手中最大的牌就用来比较大小(见下面例四);如果他们最高面值的牌也相等,那么就用次高面值的牌比较,以此类推。
//
//        考虑下面的几个例子:
//
//        局		玩家 1
//        玩家 2
//        胜利者
//        1		5H 5C 6S 7S KD
//        一对5
//        2C 3S 8S 8D TD
//        一对8
//        玩家 2
//        2		5D 8C 9S JS AC
//        最大面值牌A
//        2C 5C 7D 8S QH
//        最大面值牌Q
//        玩家 1
//        3		2D 9C AS AH AC
//        三个A
//        3D 6D 7D TD QD
//        方片Flush
//        玩家 2
//        4		4D 6S 9H QH QC
//        一对Q
//        最大牌9
//        3D 6D 7H QD QS
//        一对Q
//        最大牌7
//        玩家 1
//        5		2H 2D 4C 4D 4S
//        三个4的Full House
//        3C 3D 3S 9S 9D
//        三个3的Full House
//        玩家 1
//        文件 poker.txt 包含一千局随机牌。每一行包含十张牌(用空格分隔);前五张是玩家1的牌,后五张是玩家2的牌。 所有的牌都是合理的(没有非法字符或者重复的牌)。每个玩家的牌没有顺序,并且每一局都有明确的输赢。
//
//        其中玩家1能赢多少局?

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

// 打印时间等相关信息
class DetailPrinter
{
public:
    void Start();
    void End();
    DetailPrinter();

private:
    LARGE_INTEGER timeStart;
    LARGE_INTEGER timeEnd;
    LARGE_INTEGER freq;
};

DetailPrinter::DetailPrinter()
{
    QueryPerformanceFrequency(&freq);
}

//************************************
// Method:    Start
// Access:    public
// Describe:  执行每个方法前调用
// Returns:   void
//************************************
void DetailPrinter::Start()
{
    QueryPerformanceCounter(&timeStart);
}

//************************************
// Method:    End
// Access:    public
// Describe:  执行每个方法后调用
// Returns:   void
//************************************
void DetailPrinter::End()
{
    QueryPerformanceCounter(&timeEnd);
    cout << "Total Milliseconds is " << (double)(timeEnd.QuadPart - timeStart.QuadPart) * 1000 / freq.QuadPart << endl;

    const char BEEP_CHAR = '\007';

    cout << endl << "By GodMoon" << endl << __TIMESTAMP__ << BEEP_CHAR << endl;

    system("pause");
}

/*************************解题开始*********************************/

const string GAME_CARDS[] =
{
    "8C TS KC 9H 4S 7D 2S 5D 3S AC",
    "5C AD 5D AC 9C 7C 5H 8D TD KS",
    "3H 7H 6S KC JS QH TD JC 2D 8S",
    "TH 8H 5C QS TC 9H 4D JC KS JS",
    "7C 5H KC QH JD AS KH 4C AD 4S",
    "5H KS 9C 7D 9H 8D 3S 5D 5C AH",
    "6H 4H 5C 3H 2H 3S QH 5S 6S AS",
    "TD 8C 4H 7C TC KC 4C 3H 7S KS",
    "7C 9C 6D KD 3H 4C QS QC AC KH",
    "JC 6S 5H 2H 2D KD 9D 7C AS JS",
    "AD QH TH 9D 8H TS 6D 3S AS AC",
    "2H 4S 5C 5S TC KC JD 6C TS 3C",
    "QD AS 6H JS 2C 3D 9H KC 4H 8S",
    "KD 8S 9S 7C 2S 3S 6D 6S 4H KC",
    "3C 8C 2D 7D 4D 9S 4S QH 4H JD",
    "8C KC 7S TC 2D TS 8H QD AC 5C",
    "3D KH QD 6C 6S AD AS 8H 2H QS",
    "6S 8D 4C 8S 6C QH TC 6D 7D 9D",
    "2S 8D 8C 4C TS 9S 9D 9C AC 3D",
    "3C QS 2S 4H JH 3D 2D TD 8S 9H",
    "5H QS 8S 6D 3C 8C JD AS 7H 7D",
    "6H TD 9D AS JH 6C QC 9S KD JC",
    "AH 8S QS 4D TH AC TS 3C 3D 5C",
    "5S 4D JS 3D 8H 6C TS 3S AD 8C",
    "6D 7C 5D 5H 3S 5C JC 2H 5S 3D",
    "5H 6H 2S KS 3D 5D JD 7H JS 8H",
    "KH 4H AS JS QS QC TC 6D 7C KS",
    "3D QS TS 2H JS 4D AS 9S JC KD",
    "QD 5H 4D 5D KH 7H 3D JS KD 4H",
    "2C 9H 6H 5C 9D 6C JC 2D TH 9S",
    "7D 6D AS QD JH 4D JS 7C QS 5C",
    "3H KH QD AD 8C 8H 3S TH 9D 5S",
    "AH 9S 4D 9D 8S 4H JS 3C TC 8D",
    "2C KS 5H QD 3S TS 9H AH AD 8S",
    "5C 7H 5D KD 9H 4D 3D 2D KS AD",
    "KS KC 9S 6D 2C QH 9D 9H TS TC",
    "9C 6H 5D QH 4D AD 6D QC JS KH",
    "9S 3H 9D JD 5C 4D 9H AS TC QH",
    "2C 6D JC 9C 3C AD 9S KH 9D 7D",
    "KC 9C 7C JC JS KD 3H AS 3C 7D",
    "QD KH QS 2C 3S 8S 8H 9H 9C JC",
    "QH 8D 3C KC 4C 4H 6D AD 9H 9D",
    "3S KS QS 7H KH 7D 5H 5D JD AD",
    "2H 2C 6H TH TC 7D 8D 4H 8C AS",
    "4S 2H AC QC 3S 6D TH 4D 4C KH",
    "4D TC KS AS 7C 3C 6D 2D 9H 6C",
    "8C TD 5D QS 2C 7H 4C 9C 3H 9H",
    "5H JH TS 7S TD 6H AD QD 8H 8S",
    "5S AD 9C 8C 7C 8D 5H 9D 8S 2S",
    "4H KH KS 9S 2S KC 5S AD 4S 7D",
    "QS 9C QD 6H JS 5D AC 8D 2S AS",
    "KH AC JC 3S 9D 9S 3C 9C 5S JS",
    "AD 3C 3D KS 3S 5C 9C 8C TS 4S",
    "JH 8D 5D 6H KD QS QD 3D 6C KC",
    "8S JD 6C 3S 8C TC QC 3C QH JS",
    "KC JC 8H 2S 9H 9C JH 8S 8C 9S",
    "8S 2H QH 4D QC 9D KC AS TH 3C",
    "8S 6H TH 7C 2H 6S 3C 3H AS 7S",
    "QH 5S JS 4H 5H TS 8H AH AC JC",
    "9D 8H 2S 4S TC JC 3C 7H 3H 5C",
    "3D AD 3C 3S 4C QC AS 5D TH 8C",
    "6S 9D 4C JS KH AH TS JD 8H AD",
    "4C 6S 9D 7S AC 4D 3D 3S TC JD",
    "AD 7H 6H 4H JH KC TD TS 7D 6S",
    "8H JH TC 3S 8D 8C 9S 2C 5C 4D",
    "2C 9D KC QH TH QS JC 9C 4H TS",
    "QS 3C QD 8H KH 4H 8D TD 8S AC",
    "7C 3C TH 5S 8H 8C 9C JD TC KD",
    "QC TC JD TS 8C 3H 6H KD 7C TD",
    "JH QS KS 9C 6D 6S AS 9H KH 6H",
    "2H 4D AH 2D JH 6H TD 5D 4H JD",
    "KD 8C 9S JH QD JS 2C QS 5C 7C",
    "4S TC 7H 8D 2S 6H 7S 9C 7C KC",
    "8C 5D 7H 4S TD QC 8S JS 4H KS",
    "AD 8S JH 6D TD KD 7C 6C 2D 7D",
    "JC 6H 6S JS 4H QH 9H AH 4C 3C",
    "6H 5H AS 7C 7S 3D KH KC 5D 5C",
    "JC 3D TD AS 4D 6D 6S QH JD KS",
    "8C 7S 8S QH 2S JD 5C 7H AH QD",
    "8S 3C 6H 6C 2C 8D TD 7D 4C 4D",
    "5D QH KH 7C 2S 7H JS 6D QC QD",
    "AD 6C 6S 7D TH 6H 2H 8H KH 4H",
    "KS JS KD 5D 2D KH 7D 9C 8C 3D",
    "9C 6D QD 3C KS 3S 7S AH JD 2D",
    "AH QH AS JC 8S 8H 4C KC TH 7D",
    "JC 5H TD 7C 5D KD 4C AD 8H JS",
    "KC 2H AC AH 7D JH KH 5D 7S 6D",
    "9S 5S 9C 6H 8S TD JD 9H 6C AC",
    "7D 8S 6D TS KD 7H AC 5S 7C 5D",
    "AH QC JC 4C TC 8C 2H TS 2C 7D",
    "KD KC 6S 3D 7D 2S 8S 3H 5S 5C",
    "8S 5D 8H 4C 6H KC 3H 7C 5S KD",
    "JH 8C 3D 3C 6C KC TD 7H 7C 4C",
    "JC KC 6H TS QS TD KS 8H 8C 9S",
    "6C 5S 9C QH 7D AH KS KC 9S 2C",
    "4D 4S 8H TD 9C 3S 7D 9D AS TH",
    "6S 7D 3C 6H 5D KD 2C 5C 9D 9C",
    "2H KC 3D AD 3H QD QS 8D JC 4S",
    "8C 3H 9C 7C AD 5D JC 9D JS AS",
    "5D 9H 5C 7H 6S 6C QC JC QD 9S",
    "JC QS JH 2C 6S 9C QC 3D 4S TC",
    "4H 5S 8D 3D 4D 2S KC 2H JS 2C",
    "TD 3S TH KD 4D 7H JH JS KS AC",
    "7S 8C 9S 2D 8S 7D 5C AD 9D AS",
    "8C 7H 2S 6C TH 3H 4C 3S 8H AC",
    "KD 5H JC 8H JD 2D 4H TD JH 5C",
    "3D AS QH KS 7H JD 8S 5S 6D 5H",
    "9S 6S TC QS JC 5C 5D 9C TH 8C",
    "5H 3S JH 9H 2S 2C 6S 7S AS KS",
    "8C QD JC QS TC QC 4H AC KH 6C",
    "TC 5H 7D JH 4H 2H 8D JC KS 4D",
    "5S 9C KH KD 9H 5C TS 3D 7D 2D",
    "5H AS TC 4D 8C 2C TS 9D 3H 8D",
    "6H 8D 2D 9H JD 6C 4S 5H 5S 6D",
    "AD 9C JC 7D 6H 9S 6D JS 9H 3C",
    "AD JH TC QS 4C 5D 9S 7C 9C AH",
    "KD 6H 2H TH 8S QD KS 9D 9H AS",
    "4H 8H 8D 5H 6C AH 5S AS AD 8S",
    "QS 5D 4S 2H TD KS 5H AC 3H JC",
    "9C 7D QD KD AC 6D 5H QH 6H 5S",
    "KC AH QH 2H 7D QS 3H KS 7S JD",
    "6C 8S 3H 6D KS QD 5D 5C 8H TC",
    "9H 4D 4S 6S 9D KH QC 4H 6C JD",
    "TD 2D QH 4S 6H JH KD 3C QD 8C",
    "4S 6H 7C QD 9D AS AH 6S AD 3C",
    "2C KC TH 6H 8D AH 5C 6D 8S 5D",
    "TD TS 7C AD JC QD 9H 3C KC 7H",
    "5D 4D 5S 8H 4H 7D 3H JD KD 2D",
    "JH TD 6H QS 4S KD 5C 8S 7D 8H",
    "AC 3D AS 8C TD 7H KH 5D 6C JD",
    "9D KS 7C 6D QH TC JD KD AS KC",
    "JH 8S 5S 7S 7D AS 2D 3D AD 2H",
    "2H 5D AS 3C QD KC 6H 9H 9S 2C",
    "9D 5D TH 4C JH 3H 8D TC 8H 9H",
    "6H KD 2C TD 2H 6C 9D 2D JS 8C",
    "KD 7S 3C 7C AS QH TS AD 8C 2S",
    "QS 8H 6C JS 4C 9S QC AD TD TS",
    "2H 7C TS TC 8C 3C 9H 2D 6D JC",
    "TC 2H 8D JH KS 6D 3H TD TH 8H",
    "9D TD 9H QC 5D 6C 8H 8C KC TS",
    "2H 8C 3D AH 4D TH TC 7D 8H KC",
    "TS 5C 2D 8C 6S KH AH 5H 6H KC",
    "5S 5D AH TC 4C JD 8D 6H 8C 6C",
    "KC QD 3D 8H 2D JC 9H 4H AD 2S",
    "TD 6S 7D JS KD 4H QS 2S 3S 8C",
    "4C 9H JH TS 3S 4H QC 5S 9S 9C",
    "2C KD 9H JS 9S 3H JC TS 5D AC",
    "AS 2H 5D AD 5H JC 7S TD JS 4C",
    "2D 4S 8H 3D 7D 2C AD KD 9C TS",
    "7H QD JH 5H JS AC 3D TH 4C 8H",
    "6D KH KC QD 5C AD 7C 2D 4H AC",
    "3D 9D TC 8S QD 2C JC 4H JD AH",
    "6C TD 5S TC 8S AH 2C 5D AS AC",
    "TH 7S 3D AS 6C 4C 7H 7D 4H AH",
    "5C 2H KS 6H 7S 4H 5H 3D 3C 7H",
    "3C 9S AC 7S QH 2H 3D 6S 3S 3H",
    "2D 3H AS 2C 6H TC JS 6S 9C 6C",
    "QH KD QD 6D AC 6H KH 2C TS 8C",
    "8H 7D 3S 9H 5D 3H 4S QC 9S 5H",
    "2D 9D 7H 6H 3C 8S 5H 4D 3S 4S",
    "KD 9S 4S TC 7S QC 3S 8S 2H 7H",
    "TC 3D 8C 3H 6C 2H 6H KS KD 4D",
    "KC 3D 9S 3H JS 4S 8H 2D 6C 8S",
    "6H QS 6C TC QD 9H 7D 7C 5H 4D",
    "TD 9D 8D 6S 6C TC 5D TS JS 8H",
    "4H KC JD 9H TC 2C 6S 5H 8H AS",
    "JS 9C 5C 6S 9D JD 8H KC 4C 6D",
    "4D 8D 8S 6C 7C 6H 7H 8H 5C KC",
    "TC 3D JC 6D KS 9S 6H 7S 9C 2C",
    "6C 3S KD 5H TS 7D 9H 9S 6H KH",
    "3D QD 4C 6H TS AC 3S 5C 2H KD",
    "4C AS JS 9S 7C TS 7H 9H JC KS",
    "4H 8C JD 3H 6H AD 9S 4S 5S KS",
    "4C 2C 7D 3D AS 9C 2S QS KC 6C",
    "8S 5H 3D 2S AC 9D 6S 3S 4D TD",
    "QD TH 7S TS 3D AC 7H 6C 5D QC",
    "TC QD AD 9C QS 5C 8D KD 3D 3C",
    "9D 8H AS 3S 7C 8S JD 2D 8D KC",
    "4C TH AC QH JS 8D 7D 7S 9C KH",
    "9D 8D 4C JH 2C 2S QD KD TS 4H",
    "4D 6D 5D 2D JH 3S 8S 3H TC KH",
    "AD 4D 2C QS 8C KD JH JD AH 5C",
    "5C 6C 5H 2H JH 4H KS 7C TC 3H",
    "3C 4C QC 5D JH 9C QD KH 8D TC",
    "3H 9C JS 7H QH AS 7C 9H 5H JC",
    "2D 5S QD 4S 3C KC 6S 6C 5C 4C",
    "5D KH 2D TS 8S 9C AS 9S 7C 4C",
    "7C AH 8C 8D 5S KD QH QS JH 2C",
    "8C 9D AH 2H AC QC 5S 8H 7H 2C",
    "QD 9H 5S QS QC 9C 5H JC TH 4H",
    "6C 6S 3H 5H 3S 6H KS 8D AC 7S",
    "AC QH 7H 8C 4S KC 6C 3D 3S TC",
    "9D 3D JS TH AC 5H 3H 8S 3S TC",
    "QD KH JS KS 9S QC 8D AH 3C AC",
    "5H 6C KH 3S 9S JH 2D QD AS 8C",
    "6C 4D 7S 7H 5S JC 6S 9H 4H JH",
    "AH 5S 6H 9S AD 3S TH 2H 9D 8C",
    "4C 8D 9H 7C QC AD 4S 9C KC 5S",
    "9D 6H 4D TC 4C JH 2S 5D 3S AS",
    "2H 6C 7C KH 5C AD QS TH JD 8S",
    "3S 4S 7S AH AS KC JS 2S AD TH",
    "JS KC 2S 7D 8C 5C 9C TS 5H 9D",
    "7S 9S 4D TD JH JS KH 6H 5D 2C",
    "JD JS JC TH 2D 3D QD 8C AC 5H",
    "7S KH 5S 9D 5D TD 4S 6H 3C 2D",
    "4S 5D AC 8D 4D 7C AD AS AH 9C",
    "6S TH TS KS 2C QC AH AS 3C 4S",
    "2H 8C 3S JC 5C 7C 3H 3C KH JH",
    "7S 3H JC 5S 6H 4C 2S 4D KC 7H",
    "4D 7C 4H 9S 8S 6S AD TC 6C JC",
    "KH QS 3S TC 4C 8H 8S AC 3C TS",
    "QD QS TH 3C TS 7H 7D AH TD JC",
    "TD JD QC 4D 9S 7S TS AD 7D AC",
    "AH 7H 4S 6D 7C 2H 9D KS JC TD",
    "7C AH JD 4H 6D QS TS 2H 2C 5C",
    "TC KC 8C 9S 4C JS 3C JC 6S AH",
    "AS 7D QC 3D 5S JC JD 9D TD KH",
    "TH 3C 2S 6H AH AC 5H 5C 7S 8H",
    "QC 2D AC QD 2S 3S JD QS 6S 8H",
    "KC 4H 3C 9D JS 6H 3S 8S AS 8C",
    "7H KC 7D JD 2H JC QH 5S 3H QS",
    "9H TD 3S 8H 7S AC 5C 6C AH 7C",
    "8D 9H AH JD TD QS 7D 3S 9C 8S",
    "AH QH 3C JD KC 4S 5S 5D TD KS",
    "9H 7H 6S JH TH 4C 7C AD 5C 2D",
    "7C KD 5S TC 9D 6S 6C 5D 2S TH",
    "KC 9H 8D 5H 7H 4H QC 3D 7C AS",
    "6S 8S QC TD 4S 5C TH QS QD 2S",
    "8S 5H TH QC 9H 6S KC 7D 7C 5C",
    "7H KD AH 4D KH 5C 4S 2D KC QH",
    "6S 2C TD JC AS 4D 6C 8C 4H 5S",
    "JC TC JD 5S 6S 8D AS 9D AD 3S",
    "6D 6H 5D 5S TC 3D 7D QS 9D QD",
    "4S 6C 8S 3S 7S AD KS 2D 7D 7C",
    "KC QH JC AC QD 5D 8D QS 7H 7D",
    "JS AH 8S 5H 3D TD 3H 4S 6C JH",
    "4S QS 7D AS 9H JS KS 6D TC 5C",
    "2D 5C 6H TC 4D QH 3D 9H 8S 6C",
    "6D 7H TC TH 5S JD 5C 9C KS KD",
    "8D TD QH 6S 4S 6C 8S KC 5C TC",
    "5S 3D KS AC 4S 7D QD 4C TH 2S",
    "TS 8H 9S 6S 7S QH 3C AH 7H 8C",
    "4C 8C TS JS QC 3D 7D 5D 7S JH",
    "8S 7S 9D QC AC 7C 6D 2H JH KC",
    "JS KD 3C 6S 4S 7C AH QC KS 5H",
    "KS 6S 4H JD QS TC 8H KC 6H AS",
    "KH 7C TC 6S TD JC 5C 7D AH 3S",
    "3H 4C 4H TC TH 6S 7H 6D 9C QH",
    "7D 5H 4S 8C JS 4D 3D 8S QH KC",
    "3H 6S AD 7H 3S QC 8S 4S 7S JS",
    "3S JD KH TH 6H QS 9C 6C 2D QD",
    "4S QH 4D 5H KC 7D 6D 8D TH 5S",
    "TD AD 6S 7H KD KH 9H 5S KC JC",
    "3H QC AS TS 4S QD KS 9C 7S KC",
    "TS 6S QC 6C TH TC 9D 5C 5D KD",
    "JS 3S 4H KD 4C QD 6D 9S JC 9D",
    "8S JS 6D 4H JH 6H 6S 6C KS KH",
    "AC 7D 5D TC 9S KH 6S QD 6H AS",
    "AS 7H 6D QH 8D TH 2S KH 5C 5H",
    "4C 7C 3D QC TC 4S KH 8C 2D JS",
    "6H 5D 7S 5H 9C 9H JH 8S TH 7H",
    "AS JS 2S QD KH 8H 4S AC 8D 8S",
    "3H 4C TD KD 8C JC 5C QS 2D JD",
    "TS 7D 5D 6C 2C QS 2H 3C AH KS",
    "4S 7C 9C 7D JH 6C 5C 8H 9D QD",
    "2S TD 7S 6D 9C 9S QS KH QH 5C",
    "JC 6S 9C QH JH 8D 7S JS KH 2H",
    "8D 5H TH KC 4D 4S 3S 6S 3D QS",
    "2D JD 4C TD 7C 6D TH 7S JC AH",
    "QS 7S 4C TH 9D TS AD 4D 3H 6H",
    "2D 3H 7D JD 3D AS 2S 9C QC 8S",
    "4H 9H 9C 2C 7S JH KD 5C 5D 6H",
    "TC 9H 8H JC 3C 9S 8D KS AD KC",
    "TS 5H JD QS QH QC 8D 5D KH AH",
    "5D AS 8S 6S 4C AH QC QD TH 7H",
    "3H 4H 7D 6S 4S 9H AS 8H JS 9D",
    "JD 8C 2C 9D 7D 5H 5S 9S JC KD",
    "KD 9C 4S QD AH 7C AD 9D AC TD",
    "6S 4H 4S 9C 8D KS TC 9D JH 7C",
    "5S JC 5H 4S QH AC 2C JS 2S 9S",
    "8C 5H AS QD AD 5C 7D 8S QC TD",
    "JC 4C 8D 5C KH QS 4D 6H 2H 2C",
    "TH 4S 2D KC 3H QD AC 7H AD 9D",
    "KH QD AS 8H TH KC 8D 7S QH 8C",
    "JC 6C 7D 8C KH AD QS 2H 6S 2D",
    "JC KH 2D 7D JS QC 5H 4C 5D AD",
    "TS 3S AD 4S TD 2D TH 6S 9H JH",
    "9H 2D QS 2C 4S 3D KH AS AC 9D",
    "KH 6S 8H 4S KD 7D 9D TS QD QC",
    "JH 5H AH KS AS AD JC QC 5S KH",
    "5D 7D 6D KS KD 3D 7C 4D JD 3S",
    "AC JS 8D 5H 9C 3H 4H 4D TS 2C",
    "6H KS KH 9D 7C 2S 6S 8S 2H 3D",
    "6H AC JS 7S 3S TD 8H 3H 4H TH",
    "9H TC QC KC 5C KS 6H 4H AC 8S",
    "TC 7D QH 4S JC TS 6D 6C AC KH",
    "QH 7D 7C JH QS QD TH 3H 5D KS",
    "3D 5S 8D JS 4C 2C KS 7H 9C 4H",
    "5H 8S 4H TD 2C 3S QD QC 3H KC",
    "QC JS KD 9C AD 5S 9D 7D 7H TS",
    "8C JC KH 7C 7S 6C TS 2C QD TH",
    "5S 9D TH 3C 7S QH 8S 9C 2H 5H",
    "5D 9H 6H 2S JS KH 3H 7C 2H 5S",
    "JD 5D 5S 2C TC 2S 6S 6C 3C 8S",
    "4D KH 8H 4H 2D KS 3H 5C 2S 9H",
    "3S 2D TD 7H 8S 6H JD KC 9C 8D",
    "6S QD JH 7C 9H 5H 8S 8H TH TD",
    "QS 7S TD 7D TS JC KD 7C 3C 2C",
    "3C JD 8S 4H 2D 2S TD AS 4D AC",
    "AH KS 6C 4C 4S 7D 8C 9H 6H AS",
    "5S 3C 9S 2C QS KD 4D 4S AC 5D",
    "2D TS 2C JS KH QH 5D 8C AS KC",
    "KD 3H 6C TH 8S 7S KH 6H 9S AC",
    "6H 7S 6C QS AH 2S 2H 4H 5D 5H",
    "5H JC QD 2C 2S JD AS QC 6S 7D",
    "6C TC AS KD 8H 9D 2C 7D JH 9S",
    "2H 4C 6C AH 8S TD 3H TH 7C TS",
    "KD 4S TS 6C QH 8D 9D 9C AH 7D",
    "6D JS 5C QD QC 9C 5D 8C 2H KD",
    "3C QH JH AD 6S AH KC 8S 6D 6H",
    "3D 7C 4C 7S 5S 3S 6S 5H JC 3C",
    "QH 7C 5H 3C 3S 8C TS 4C KD 9C",
    "QD 3S 7S 5H 7H QH JC 7C 8C KD",
    "3C KD KH 2S 4C TS AC 6S 2C 7C",
    "2C KH 3C 4C 6H 4D 5H 5S 7S QD",
    "4D 7C 8S QD TS 9D KS 6H KD 3C",
    "QS 4D TS 7S 4C 3H QD 8D 9S TC",
    "TS QH AC 6S 3C 9H 9D QS 8S 6H",
    "3S 7S 5D 4S JS 2D 6C QH 6S TH",
    "4C 4H AS JS 5D 3D TS 9C AC 8S",
    "6S 9C 7C 3S 5C QS AD AS 6H 3C",
    "9S 8C 7H 3H 6S 7C AS 9H JD KH",
    "3D 3H 7S 4D 6C 7C AC 2H 9C TH",
    "4H 5S 3H AC TC TH 9C 9H 9S 8D",
    "8D 9H 5H 4D 6C 2H QD 6S 5D 3S",
    "4C 5C JD QS 4D 3H TH AC QH 8C",
    "QC 5S 3C 7H AD 4C KS 4H JD 6D",
    "QS AH 3H KS 9H 2S JS JH 5H 2H",
    "2H 5S TH 6S TS 3S KS 3C 5H JS",
    "2D 9S 7H 3D KC JH 6D 7D JS TD",
    "AC JS 8H 2C 8C JH JC 2D TH 7S",
    "5D 9S 8H 2H 3D TC AH JC KD 9C",
    "9D QD JC 2H 6D KH TS 9S QH TH",
    "2C 8D 4S JD 5H 3H TH TC 9C KC",
    "AS 3D 9H 7D 4D TH KH 2H 7S 3H",
    "4H 7S KS 2S JS TS 8S 2H QD 8D",
    "5S 6H JH KS 8H 2S QC AC 6S 3S",
    "JC AS AD QS 8H 6C KH 4C 4D QD",
    "2S 3D TS TD 9S KS 6S QS 5C 8D",
    "3C 6D 4S QC KC JH QD TH KH AD",
    "9H AH 4D KS 2S 8D JH JC 7C QS",
    "2D 6C TH 3C 8H QD QH 2S 3S KS",
    "6H 5D 9S 4C TS TD JS QD 9D JD",
    "5H 8H KH 8S KS 7C TD AD 4S KD",
    "2C 7C JC 5S AS 6C 7D 8S 5H 9C",
    "6S QD 9S TS KH QS 5S QH 3C KC",
    "7D 3H 3C KD 5C AS JH 7H 6H JD",
    "9D 5C 9H KC 8H KS 4S AD 4D 2S",
    "3S JD QD 8D 2S 7C 5S 6S 5H TS",
    "6D 9S KC TD 3S 6H QD JD 5C 8D",
    "5H 9D TS KD 8D 6H TD QC 4C 7D",
    "6D 4S JD 9D AH 9S AS TD 9H QD",
    "2D 5S 2H 9C 6H 9S TD QC 7D TC",
    "3S 2H KS TS 2C 9C 8S JS 9D 7D",
    "3C KC 6D 5D 6C 6H 8S AS 7S QS",
    "JH 9S 2H 8D 4C 8H 9H AD TH KH",
    "QC AS 2S JS 5C 6H KD 3H 7H 2C",
    "QD 8H 2S 8D 3S 6D AH 2C TC 5C",
    "JD JS TS 8S 3H 5D TD KC JC 6H",
    "6S QS TC 3H 5D AH JC 7C 7D 4H",
    "7C 5D 8H 9C 2H 9H JH KH 5S 2C",
    "9C 7H 6S TH 3S QC QD 4C AC JD",
    "2H 5D 9S 7D KC 3S QS 2D AS KH",
    "2S 4S 2H 7D 5C TD TH QH 9S 4D",
    "6D 3S TS 6H 4H KS 9D 8H 5S 2D",
    "9H KS 4H 3S 5C 5D KH 6H 6S JS",
    "KC AS 8C 4C JC KH QC TH QD AH",
    "6S KH 9S 2C 5H TC 3C 7H JC 4D",
    "JD 4S 6S 5S 8D 7H 7S 4D 4C 2H",
    "7H 9H 5D KH 9C 7C TS TC 7S 5H",
    "4C 8D QC TS 4S 9H 3D AD JS 7C",
    "8C QS 5C 5D 3H JS AH KC 4S 9D",
    "TS JD 8S QS TH JH KH 2D QD JS",
    "JD QC 5D 6S 9H 3S 2C 8H 9S TS",
    "2S 4C AD 7H JC 5C 2D 6D 4H 3D",
    "7S JS 2C 4H 8C AD QD 9C 3S TD",
    "JD TS 4C 6H 9H 7D QD 6D 3C AS",
    "AS 7C 4C 6S 5D 5S 5C JS QC 4S",
    "KD 6S 9S 7C 3C 5S 7D JH QD JS",
    "4S 7S JH 2C 8S 5D 7H 3D QH AD",
    "TD 6H 2H 8D 4H 2D 7C AD KH 5D",
    "TS 3S 5H 2C QD AH 2S 5C KH TD",
    "KC 4D 8C 5D AS 6C 2H 2S 9H 7C",
    "KD JS QC TS QS KH JH 2C 5D AD",
    "3S 5H KC 6C 9H 3H 2H AD 7D 7S",
    "7S JS JH KD 8S 7D 2S 9H 7C 2H",
    "9H 2D 8D QC 6S AD AS 8H 5H 6C",
    "2S 7H 6C 6D 7D 8C 5D 9D JC 3C",
    "7C 9C 7H JD 2H KD 3S KH AD 4S",
    "QH AS 9H 4D JD KS KD TS KH 5H",
    "4C 8H 5S 3S 3D 7D TD AD 7S KC",
    "JS 8S 5S JC 8H TH 9C 4D 5D KC",
    "7C 5S 9C QD 2C QH JS 5H 8D KH",
    "TD 2S KS 3D AD KC 7S TC 3C 5D",
    "4C 2S AD QS 6C 9S QD TH QH 5C",
    "8C AD QS 2D 2S KC JD KS 6C JC",
    "8D 4D JS 2H 5D QD 7S 7D QH TS",
    "6S 7H 3S 8C 8S 9D QS 8H 6C 9S",
    "4S TC 2S 5C QD 4D QS 6D TH 6S",
    "3S 5C 9D 6H 8D 4C 7D TC 7C TD",
    "AH 6S AS 7H 5S KD 3H 5H AC 4C",
    "8D 8S AH KS QS 2C AD 6H 7D 5D",
    "6H 9H 9S 2H QS 8S 9C 5D 2D KD",
    "TS QC 5S JH 7D 7S TH 9S 9H AC",
    "7H 3H 6S KC 4D 6D 5C 4S QD TS",
    "TD 2S 7C QD 3H JH 9D 4H 7S 7H",
    "KS 3D 4H 5H TC 2S AS 2D 6D 7D",
    "8H 3C 7H TD 3H AD KC TH 9C KH",
    "TC 4C 2C 9S 9D 9C 5C 2H JD 3C",
    "3H AC TS 5D AD 8D 6H QC 6S 8C",
    "2S TS 3S JD 7H 8S QH 4C 5S 8D",
    "AC 4S 6C 3C KH 3D 7C 2D 8S 2H",
    "4H 6C 8S TH 2H 4S 8H 9S 3H 7S",
    "7C 4C 9C 2C 5C AS 5D KD 4D QH",
    "9H 4H TS AS 7D 8D 5D 9S 8C 2H",
    "QC KD AC AD 2H 7S AS 3S 2D 9S",
    "2H QC 8H TC 6D QD QS 5D KH 3C",
    "TH JD QS 4C 2S 5S AD 7H 3S AS",
    "7H JS 3D 6C 3S 6D AS 9S AC QS",
    "9C TS AS 8C TC 8S 6H 9D 8D 6C",
    "4D JD 9C KC 7C 6D KS 3S 8C AS",
    "3H 6S TC 8D TS 3S KC 9S 7C AS",
    "8C QC 4H 4S 8S 6C 3S TC AH AC",
    "4D 7D 5C AS 2H 6S TS QC AD TC",
    "QD QC 8S 4S TH 3D AH TS JH 4H",
    "5C 2D 9S 2C 3H 3C 9D QD QH 7D",
    "KC 9H 6C KD 7S 3C 4D AS TC 2D",
    "3D JS 4D 9D KS 7D TH QC 3H 3C",
    "8D 5S 2H 9D 3H 8C 4C 4H 3C TH",
    "JC TH 4S 6S JD 2D 4D 6C 3D 4C",
    "TS 3S 2D 4H AC 2C 6S 2H JH 6H",
    "TD 8S AD TC AH AC JH 9S 6S 7S",
    "6C KC 4S JD 8D 9H 5S 7H QH AH",
    "KD 8D TS JH 5C 5H 3H AD AS JS",
    "2D 4H 3D 6C 8C 7S AD 5D 5C 8S",
    "TD 5D 7S 9C 4S 5H 6C 8C 4C 8S",
    "JS QH 9C AS 5C QS JC 3D QC 7C",
    "JC 9C KH JH QS QC 2C TS 3D AD",
    "5D JH AC 5C 9S TS 4C JD 8C KS",
    "KC AS 2D KH 9H 2C 5S 4D 3D 6H",
    "TH AH 2D 8S JC 3D 8C QH 7S 3S",
    "8H QD 4H JC AS KH KS 3C 9S 6D",
    "9S QH 7D 9C 4S AC 7H KH 4D KD",
    "AH AD TH 6D 9C 9S KD KS QH 4H",
    "QD 6H 9C 7C QS 6D 6S 9D 5S JH",
    "AH 8D 5H QD 2H JC KS 4H KH 5S",
    "5C 2S JS 8D 9C 8C 3D AS KC AH",
    "JD 9S 2H QS 8H 5S 8C TH 5C 4C",
    "QC QS 8C 2S 2C 3S 9C 4C KS KH",
    "2D 5D 8S AH AD TD 2C JS KS 8C",
    "TC 5S 5H 8H QC 9H 6H JD 4H 9S",
    "3C JH 4H 9H AH 4S 2H 4C 8D AC",
    "8S TH 4D 7D 6D QD QS 7S TC 7C",
    "KH 6D 2D JD 5H JS QD JH 4H 4S",
    "9C 7S JH 4S 3S TS QC 8C TC 4H",
    "QH 9D 4D JH QS 3S 2C 7C 6C 2D",
    "4H 9S JD 5C 5H AH 9D TS 2D 4C",
    "KS JH TS 5D 2D AH JS 7H AS 8D",
    "JS AH 8C AD KS 5S 8H 2C 6C TH",
    "2H 5D AD AC KS 3D 8H TS 6H QC",
    "6D 4H TS 9C 5H JS JH 6S JD 4C",
    "JH QH 4H 2C 6D 3C 5D 4C QS KC",
    "6H 4H 6C 7H 6S 2S 8S KH QC 8C",
    "3H 3D 5D KS 4H TD AD 3S 4D TS",
    "5S 7C 8S 7D 2C KS 7S 6C 8C JS",
    "5D 2H 3S 7C 5C QD 5H 6D 9C 9H",
    "JS 2S KD 9S 8D TD TS AC 8C 9D",
    "5H QD 2S AC 8C 9H KS 7C 4S 3C",
    "KH AS 3H 8S 9C JS QS 4S AD 4D",
    "AS 2S TD AD 4D 9H JC 4C 5H QS",
    "5D 7C 4H TC 2D 6C JS 4S KC 3S",
    "4C 2C 5D AC 9H 3D JD 8S QS QH",
    "2C 8S 6H 3C QH 6D TC KD AC AH",
    "QC 6C 3S QS 4S AC 8D 5C AD KH",
    "5S 4C AC KH AS QC 2C 5C 8D 9C",
    "8H JD 3C KH 8D 5C 9C QD QH 9D",
    "7H TS 2C 8C 4S TD JC 9C 5H QH",
    "JS 4S 2C 7C TH 6C AS KS 7S JD",
    "JH 7C 9H 7H TC 5H 3D 6D 5D 4D",
    "2C QD JH 2H 9D 5S 3D TD AD KS",
    "JD QH 3S 4D TH 7D 6S QS KS 4H",
    "TC KS 5S 8D 8H AD 2S 2D 4C JH",
    "5S JH TC 3S 2D QS 9D 4C KD 9S",
    "AC KH 3H AS 9D KC 9H QD 6C 6S",
    "9H 7S 3D 5C 7D KC TD 8H 4H 6S",
    "3C 7H 8H TC QD 4D 7S 6S QH 6C",
    "6D AD 4C QD 6C 5D 7D 9D KS TS",
    "JH 2H JD 9S 7S TS KH 8D 5D 8H",
    "2D 9S 4C 7D 9D 5H QD 6D AC 6S",
    "7S 6D JC QD JH 4C 6S QS 2H 7D",
    "8C TD JH KD 2H 5C QS 2C JS 7S",
    "TC 5H 4H JH QD 3S 5S 5D 8S KH",
    "KS KH 7C 2C 5D JH 6S 9C 6D JC",
    "5H AH JD 9C JS KC 2H 6H 4D 5S",
    "AS 3C TH QC 6H 9C 8S 8C TD 7C",
    "KC 2C QD 9C KH 4D 7S 3C TS 9H",
    "9C QC 2S TS 8C TD 9S QD 3S 3C",
    "4D 9D TH JH AH 6S 2S JD QH JS",
    "QD 9H 6C KD 7D 7H 5D 6S 8H AH",
    "8H 3C 4S 2H 5H QS QH 7S 4H AC",
    "QS 3C 7S 9S 4H 3S AH KS 9D 7C",
    "AD 5S 6S 2H 2D 5H TC 4S 3C 8C",
    "QH TS 6S 4D JS KS JH AS 8S 6D",
    "2C 8S 2S TD 5H AS TC TS 6C KC",
    "KC TS 8H 2H 3H 7C 4C 5S TH TD",
    "KD AD KH 7H 7S 5D 5H 5S 2D 9C",
    "AD 9S 3D 7S 8C QC 7C 9C KD KS",
    "3C QC 9S 8C 4D 5C AS QD 6C 2C",
    "2H KC 8S JD 7S AC 8D 5C 2S 4D",
    "9D QH 3D 2S TC 3S KS 3C 9H TD",
    "KD 6S AC 2C 7H 5H 3S 6C 6H 8C",
    "QH TC 8S 6S KH TH 4H 5D TS 4D",
    "8C JS 4H 6H 2C 2H 7D AC QD 3D",
    "QS KC 6S 2D 5S 4H TD 3H JH 4C",
    "7S 5H 7H 8H KH 6H QS TH KD 7D",
    "5H AD KD 7C KH 5S TD 6D 3C 6C",
    "8C 9C 5H JD 7C KC KH 7H 2H 3S",
    "7S 4H AD 4D 8S QS TH 3D 7H 5S",
    "8D TC KS KD 9S 6D AD JD 5C 2S",
    "7H 8H 6C QD 2H 6H 9D TC 9S 7C",
    "8D 6D 4C 7C 6C 3C TH KH JS JH",
    "5S 3S 8S JS 9H AS AD 8H 7S KD",
    "JH 7C 2C KC 5H AS AD 9C 9S JS",
    "AD AC 2C 6S QD 7C 3H TH KS KD",
    "9D JD 4H 8H 4C KH 7S TS 8C KC",
    "3S 5S 2H 7S 6H 7D KS 5C 6D AD",
    "5S 8C 9H QS 7H 7S 2H 6C 7D TD",
    "QS 5S TD AC 9D KC 3D TC 2D 4D",
    "TD 2H 7D JD QD 4C 7H 5D KC 3D",
    "4C 3H 8S KD QH 5S QC 9H TC 5H",
    "9C QD TH 5H TS 5C 9H AH QH 2C",
    "4D 6S 3C AC 6C 3D 2C 2H TD TH",
    "AC 9C 5D QC 4D AD 8D 6D 8C KC",
    "AD 3C 4H AC 8D 8H 7S 9S TD JC",
    "4H 9H QH JS 2D TH TD TC KD KS",
    "5S 6S 9S 8D TH AS KH 5H 5C 8S",
    "JD 2S 9S 6S 5S 8S 5D 7S 7H 9D",
    "5D 8C 4C 9D AD TS 2C 7D KD TC",
    "8S QS 4D KC 5C 8D 4S KH JD KD",
    "AS 5C AD QH 7D 2H 9S 7H 7C TC",
    "2S 8S JD KH 7S 6C 6D AD 5D QC",
    "9H 6H 3S 8C 8H AH TC 4H JS TD",
    "2C TS 4D 7H 2D QC 9C 5D TH 7C",
    "6C 8H QC 5D TS JH 5C 5H 9H 4S",
    "2D QC 7H AS JS 8S 2H 4C 4H 8D",
    "JS 6S AC KD 3D 3C 4S 7H TH KC",
    "QH KH 6S QS 5S 4H 3C QD 3S 3H",
    "7H AS KH 8C 4H 9C 5S 3D 6S TS",
    "9C 7C 3H 5S QD 2C 3D AD AC 5H",
    "JH TD 2D 4C TS 3H KH AD 3S 7S",
    "AS 4C 5H 4D 6S KD JC 3C 6H 2D",
    "3H 6S 8C 2D TH 4S AH QH AD 5H",
    "7C 2S 9H 7H KC 5C 6D 5S 3H JC",
    "3C TC 9C 4H QD TD JH 6D 9H 5S",
    "7C 6S 5C 5D 6C 4S 7H 9H 6H AH",
    "AD 2H 7D KC 2C 4C 2S 9S 7H 3S",
    "TH 4C 8S 6S 3S AD KS AS JH TD",
    "5C TD 4S 4D AD 6S 5D TC 9C 7D",
    "8H 3S 4D 4S 5S 6H 5C AC 3H 3D",
    "9H 3C AC 4S QS 8S 9D QH 5H 4D",
    "JC 6C 5H TS AC 9C JD 8C 7C QD",
    "8S 8H 9C JD 2D QC QH 6H 3C 8D",
    "KS JS 2H 6H 5H QH QS 3H 7C 6D",
    "TC 3H 4S 7H QC 2H 3S 8C JS KH",
    "AH 8H 5S 4C 9H JD 3H 7S JC AC",
    "3C 2D 4C 5S 6C 4S QS 3S JD 3D",
    "5H 2D TC AH KS 6D 7H AD 8C 6H",
    "6C 7S 3C JD 7C 8H KS KH AH 6D",
    "AH 7D 3H 8H 8S 7H QS 5H 9D 2D",
    "JD AC 4H 7S 8S 9S KS AS 9D QH",
    "7S 2C 8S 5S JH QS JC AH KD 4C",
    "AH 2S 9H 4H 8D TS TD 6H QH JD",
    "4H JC 3H QS 6D 7S 9C 8S 9D 8D",
    "5H TD 4S 9S 4C 8C 8D 7H 3H 3D",
    "QS KH 3S 2C 2S 3C 7S TD 4S QD",
    "7C TD 4D 5S KH AC AS 7H 4C 6C",
    "2S 5H 6D JD 9H QS 8S 2C 2H TD",
    "2S TS 6H 9H 7S 4H JC 4C 5D 5S",
    "2C 5H 7D 4H 3S QH JC JS 6D 8H",
    "4C QH 7C QD 3S AD TH 8S 5S TS",
    "9H TC 2S TD JC 7D 3S 3D TH QH",
    "7D 4C 8S 5C JH 8H 6S 3S KC 3H",
    "JC 3H KH TC QH TH 6H 2C AC 5H",
    "QS 2H 9D 2C AS 6S 6C 2S 8C 8S",
    "9H 7D QC TH 4H KD QS AC 7S 3C",
    "4D JH 6S 5S 8H KS 9S QC 3S AS",
    "JD 2D 6S 7S TC 9H KC 3H 7D KD",
    "2H KH 7C 4D 4S 3H JS QD 7D KC",
    "4C JC AS 9D 3C JS 6C 8H QD 4D",
    "AH JS 3S 6C 4C 3D JH 6D 9C 9H",
    "9H 2D 8C 7H 5S KS 6H 9C 2S TC",
    "6C 8C AD 7H 6H 3D KH AS 5D TH",
    "KS 8C 3S TS 8S 4D 5S 9S 6C 4H",
    "9H 4S 4H 5C 7D KC 2D 2H 9D JH",
    "5C JS TC 9D 9H 5H 7S KH JC 6S",
    "7C 9H 8H 4D JC KH JD 2H TD TC",
    "8H 6C 2H 2C KH 6H 9D QS QH 5H",
    "AC 7D 2S 3D QD JC 2D 8D JD JH",
    "2H JC 2D 7H 2C 3C 8D KD TD 4H",
    "3S 4H 6D 8D TS 3H TD 3D 6H TH",
    "JH JC 3S AC QH 9H 7H 8S QC 2C",
    "7H TD QS 4S 8S 9C 2S 5D 4D 2H",
    "3D TS 3H 2S QC 8H 6H KC JC KS",
    "5D JD 7D TC 8C 6C 9S 3D 8D AC",
    "8H 6H JH 6C 5D 8D 8S 4H AD 2C",
    "9D 4H 2D 2C 3S TS AS TC 3C 5D",
    "4D TH 5H KS QS 6C 4S 2H 3D AD",
    "5C KC 6H 2C 5S 3C 4D 2D 9H 9S",
    "JD 4C 3H TH QH 9H 5S AH 8S AC",
    "7D 9S 6S 2H TD 9C 4H 8H QS 4C",
    "3C 6H 5D 4H 8C 9C KC 6S QD QS",
    "3S 9H KD TC 2D JS 8C 6S 4H 4S",
    "2S 4C 8S QS 6H KH 3H TH 8C 5D",
    "2C KH 5S 3S 7S 7H 6C 9D QD 8D",
    "8H KS AC 2D KH TS 6C JS KC 7H",
    "9C KS 5C TD QC AH 6C 5H 9S 7C",
    "5D 4D 3H 4H 6S 7C 7S AH QD TD",
    "2H 7D QC 6S TC TS AH 7S 9D 3H",
    "TH 5H QD 9S KS 7S 7C 6H 8C TD",
    "TH 2D 4D QC 5C 7D JD AH 9C 4H",
    "4H 3H AH 8D 6H QC QH 9H 2H 2C",
    "2D AD 4C TS 6H 7S TH 4H QS TD",
    "3C KD 2H 3H QS JD TC QC 5D 8H",
    "KS JC QD TH 9S KD 8D 8C 2D 9C",
    "3C QD KD 6D 4D 8D AH AD QC 8S",
    "8H 3S 9D 2S 3H KS 6H 4C 7C KC",
    "TH 9S 5C 3D 7D 6H AC 7S 4D 2C",
    "5C 3D JD 4D 2D 6D 5H 9H 4C KH",
    "AS 7H TD 6C 2H 3D QD KS 4C 4S",
    "JC 3C AC 7C JD JS 8H 9S QC 5D",
    "JD 6S 5S 2H AS 8C 7D 5H JH 3D",
    "8D TC 5S 9S 8S 3H JC 5H 7S AS",
    "5C TD 3D 7D 4H 8D 7H 4D 5D JS",
    "QS 9C KS TD 2S 8S 5C 2H 4H AS",
    "TH 7S 4H 7D 3H JD KD 5D 2S KC",
    "JD 7H 4S 8H 4C JS 6H QH 5S 4H",
    "2C QS 8C 5S 3H QC 2S 6C QD AD",
    "8C 3D JD TC 4H 2H AD 5S AC 2S",
    "5D 2C JS 2D AD 9D 3D 4C 4S JH",
    "8D 5H 5D 6H 7S 4D KS 9D TD JD",
    "3D 6D 9C 2S AS 7D 5S 5C 8H JD",
    "7C 8S 3S 6S 5H JD TC AD 7H 7S",
    "2S 9D TS 4D AC 8D 6C QD JD 3H",
    "9S KH 2C 3C AC 3D 5H 6H 8D 5D",
    "KS 3D 2D 6S AS 4C 2S 7C 7H KH",
    "AC 2H 3S JC 5C QH 4D 2D 5H 7S",
    "TS AS JD 8C 6H JC 8S 5S 2C 5D",
    "7S QH 7H 6C QC 8H 2D 7C JD 2S",
    "2C QD 2S 2H JC 9C 5D 2D JD JH",
    "7C 5C 9C 8S 7D 6D 8D 6C 9S JH",
    "2C AD 6S 5H 3S KS 7S 9D KH 4C",
    "7H 6C 2C 5C TH 9D 8D 3S QC AH",
    "5S KC 6H TC 5H 8S TH 6D 3C AH",
    "9C KD 4H AD TD 9S 4S 7D 6H 5D",
    "7H 5C 5H 6D AS 4C KD KH 4H 9D",
    "3C 2S 5C 6C JD QS 2H 9D 7D 3H",
    "AC 2S 6S 7S JS QD 5C QS 6H AD",
    "5H TH QC 7H TC 3S 7C 6D KC 3D",
    "4H 3D QC 9S 8H 2C 3S JC KS 5C",
    "4S 6S 2C 6H 8S 3S 3D 9H 3H JS",
    "4S 8C 4D 2D 8H 9H 7D 9D AH TS",
    "9S 2C 9H 4C 8D AS 7D 3D 6D 5S",
    "6S 4C 7H 8C 3H 5H JC AH 9D 9C",
    "2S 7C 5S JD 8C 3S 3D 4D 7D 6S",
    "3C KC 4S 5D 7D 3D JD 7H 3H 4H",
    "9C 9H 4H 4D TH 6D QD 8S 9S 7S",
    "2H AC 8S 4S AD 8C 2C AH 7D TC",
    "TS 9H 3C AD KS TC 3D 8C 8H JD",
    "QC 8D 2C 3C 7D 7C JD 9H 9C 6C",
    "AH 6S JS JH 5D AS QC 2C JD TD",
    "9H KD 2H 5D 2D 3S 7D TC AH TS",
    "TD 8H AS 5D AH QC AC 6S TC 5H",
    "KS 4S 7H 4D 8D 9C TC 2H 6H 3H",
    "3H KD 4S QD QH 3D 8H 8C TD 7S",
    "8S JD TC AH JS QS 2D KH KS 4D",
    "3C AD JC KD JS KH 4S TH 9H 2C",
    "QC 5S JS 9S KS AS 7C QD 2S JD",
    "KC 5S QS 3S 2D AC 5D 9H 8H KS",
    "6H 9C TC AD 2C 6D 5S JD 6C 7C",
    "QS KH TD QD 2C 3H 8S 2S QC AH",
    "9D 9H JH TC QH 3C 2S JS 5C 7H",
    "6C 3S 3D 2S 4S QD 2D TH 5D 2C",
    "2D 6H 6D 2S JC QH AS 7H 4H KH",
    "5H 6S KS AD TC TS 7C AC 4S 4H",
    "AD 3C 4H QS 8C 9D KS 2H 2D 4D",
    "4S 9D 6C 6D 9C AC 8D 3H 7H KD",
    "JC AH 6C TS JD 6D AD 3S 5D QD",
    "JC JH JD 3S 7S 8S JS QC 3H 4S",
    "JD TH 5C 2C AD JS 7H 9S 2H 7S",
    "8D 3S JH 4D QC AS JD 2C KC 6H",
    "2C AC 5H KD 5S 7H QD JH AH 2D",
    "JC QH 8D 8S TC 5H 5C AH 8C 6C",
    "3H JS 8S QD JH 3C 4H 6D 5C 3S",
    "6D 4S 4C AH 5H 5S 3H JD 7C 8D",
    "8H AH 2H 3H JS 3C 7D QC 4H KD",
    "6S 2H KD 5H 8H 2D 3C 8S 7S QD",
    "2S 7S KC QC AH TC QS 6D 4C 8D",
    "5S 9H 2C 3S QD 7S 6C 2H 7C 9D",
    "3C 6C 5C 5S JD JC KS 3S 5D TS",
    "7C KS 6S 5S 2S 2D TC 2H 5H QS",
    "AS 7H 6S TS 5H 9S 9D 3C KD 2H",
    "4S JS QS 3S 4H 7C 2S AC 6S 9D",
    "8C JH 2H 5H 7C 5D QH QS KH QC",
    "3S TD 3H 7C KC 8D 5H 8S KH 8C",
    "4H KH JD TS 3C 7H AS QC JS 5S",
    "AH 9D 2C 8D 4D 2D 6H 6C KC 6S",
    "2S 6H 9D 3S 7H 4D KH 8H KD 3D",
    "9C TC AC JH KH 4D JD 5H TD 3S",
    "7S 4H 9D AS 4C 7D QS 9S 2S KH",
    "3S 8D 8S KS 8C JC 5C KH 2H 5D",
    "8S QH 2C 4D KC JS QC 9D AC 6H",
    "8S 8C 7C JS JD 6S 4C 9C AC 4S",
    "QH 5D 2C 7D JC 8S 2D JS JH 4C",
    "JS 4C 7S TS JH KC KH 5H QD 4S",
    "QD 8C 8D 2D 6S TD 9D AC QH 5S",
    "QH QC JS 3D 3C 5C 4H KH 8S 7H",
    "7C 2C 5S JC 8S 3H QC 5D 2H KC",
    "5S 8D KD 6H 4H QD QH 6D AH 3D",
    "7S KS 6C 2S 4D AC QS 5H TS JD",
    "7C 2D TC 5D QS AC JS QC 6C KC",
    "2C KS 4D 3H TS 8S AD 4H 7S 9S",
    "QD 9H QH 5H 4H 4D KH 3S JC AD",
    "4D AC KC 8D 6D 4C 2D KH 2C JD",
    "2C 9H 2D AH 3H 6D 9C 7D TC KS",
    "8C 3H KD 7C 5C 2S 4S 5H AS AH",
    "TH JD 4H KD 3H TC 5C 3S AC KH",
    "6D 7H AH 7S QC 6H 2D TD JD AS",
    "JH 5D 7H TC 9S 7D JC AS 5S KH",
    "2H 8C AD TH 6H QD KD 9H 6S 6C",
    "QH KC 9D 4D 3S JS JH 4H 2C 9H",
    "TC 7H KH 4H JC 7D 9S 3H QS 7S",
    "AD 7D JH 6C 7H 4H 3S 3H 4D QH",
    "JD 2H 5C AS 6C QC 4D 3C TC JH",
    "AC JD 3H 6H 4C JC AD 7D 7H 9H",
    "4H TC TS 2C 8C 6S KS 2H JD 9S",
    "4C 3H QS QC 9S 9H 6D KC 9D 9C",
    "5C AD 8C 2C QH TH QD JC 8D 8H",
    "QC 2C 2S QD 9C 4D 3S 8D JH QS",
    "9D 3S 2C 7S 7C JC TD 3C TC 9H",
    "3C TS 8H 5C 4C 2C 6S 8D 7C 4H",
    "KS 7H 2H TC 4H 2C 3S AS AH QS",
    "8C 2D 2H 2C 4S 4C 6S 7D 5S 3S",
    "TH QC 5D TD 3C QS KD KC KS AS",
    "4D AH KD 9H KS 5C 4C 6H JC 7S",
    "KC 4H 5C QS TC 2H JC 9S AH QH",
    "4S 9H 3H 5H 3C QD 2H QC JH 8H",
    "5D AS 7H 2C 3D JH 6H 4C 6S 7D",
    "9C JD 9H AH JS 8S QH 3H KS 8H",
    "3S AC QC TS 4D AD 3D AH 8S 9H",
    "7H 3H QS 9C 9S 5H JH JS AH AC",
    "8D 3C JD 2H AC 9C 7H 5S 4D 8H",
    "7C JH 9H 6C JS 9S 7H 8C 9D 4H",
    "2D AS 9S 6H 4D JS JH 9H AD QD",
    "6H 7S JH KH AH 7H TD 5S 6S 2C",
    "8H JH 6S 5H 5S 9D TC 4C QC 9S",
    "7D 2C KD 3H 5H AS QD 7H JS 4D",
    "TS QH 6C 8H TH 5H 3C 3H 9C 9D",
    "AD KH JS 5D 3H AS AC 9S 5C KC",
    "2C KH 8C JC QS 6D AH 2D KC TC",
    "9D 3H 2S 7C 4D 6D KH KS 8D 7D",
    "9H 2S TC JH AC QC 3H 5S 3S 8H",
    "3S AS KD 8H 4C 3H 7C JH QH TS",
    "7S 6D 7H 9D JH 4C 3D 3S 6C AS",
    "4S 2H 2C 4C 8S 5H KC 8C QC QD",
    "3H 3S 6C QS QC 2D 6S 5D 2C 9D",
    "2H 8D JH 2S 3H 2D 6C 5C 7S AD",
    "9H JS 5D QH 8S TS 2H 7S 6S AD",
    "6D QC 9S 7H 5H 5C 7D KC JD 4H",
    "QC 5S 9H 9C 4D 6S KS 2S 4C 7C",
    "9H 7C 4H 8D 3S 6H 5C 8H JS 7S",
    "2D 6H JS TD 4H 4D JC TH 5H KC",
    "AC 7C 8D TH 3H 9S 2D 4C KC 4D",
    "KD QS 9C 7S 3D KS AD TS 4C 4H",
    "QH 9C 8H 2S 7D KS 7H 5D KD 4C",
    "9C 2S 2H JC 6S 6C TC QC JH 5C",
    "7S AC 8H KC 8S 6H QS JC 3D 6S",
    "JS 2D JH 8C 4S 6H 8H 6D 5D AD",
    "6H 7D 2S 4H 9H 7C AS AC 8H 5S",
    "3C JS 4S 6D 5H 2S QH 6S 9C 2C",
    "3D 5S 6S 9S 4C QS 8D QD 8S TC",
    "9C 3D AH 9H 5S 2C 7D AD JC 3S",
    "7H TC AS 3C 6S 6D 7S KH KC 9H",
    "3S TC 8H 6S 5H JH 8C 7D AC 2S",
    "QD 9D 9C 3S JC 8C KS 8H 5D 4D",
    "JS AH JD 6D 9D 8C 9H 9S 8H 3H",
    "2D 6S 4C 4D 8S AD 4S TC AH 9H",
    "TS AC QC TH KC 6D 4H 7S 8C 2H",
    "3C QD JS 9D 5S JC AH 2H TS 9H",
    "3H 4D QH 5D 9C 5H 7D 4S JC 3S",
    "8S TH 3H 7C 2H JD JS TS AC 8D",
    "9C 2H TD KC JD 2S 8C 5S AD 2C",
    "3D KD 7C 5H 4D QH QD TC 6H 7D",
    "7H 2C KC 5S KD 6H AH QC 7S QH",
    "6H 5C AC 5H 2C 9C 2D 7C TD 2S",
    "4D 9D AH 3D 7C JD 4H 8C 4C KS",
    "TH 3C JS QH 8H 4C AS 3D QS QC",
    "4D 7S 5H JH 6D 7D 6H JS KH 3C",
    "QD 8S 7D 2H 2C 7C JC 2S 5H 8C",
    "QH 8S 9D TC 2H AD 7C 8D QD 6S",
    "3S 7C AD 9H 2H 9S JD TS 4C 2D",
    "3S AS 4H QC 2C 8H 8S 7S TD TC",
    "JH TH TD 3S 4D 4H 5S 5D QS 2C",
    "8C QD QH TC 6D 4S 9S 9D 4H QC",
    "8C JS 9D 6H JD 3H AD 6S TD QC",
    "KC 8S 3D 7C TD 7D 8D 9H 4S 3S",
    "6C 4S 3D 9D KD TC KC KS AC 5S",
    "7C 6S QH 3D JS KD 6H 6D 2D 8C",
    "JD 2S 5S 4H 8S AC 2D 6S TS 5C",
    "5H 8C 5S 3C 4S 3D 7C 8D AS 3H",
    "AS TS 7C 3H AD 7D JC QS 6C 6H",
    "3S 9S 4C AC QH 5H 5D 9H TS 4H",
    "6C 5C 7H 7S TD AD JD 5S 2H 2S",
    "7D 6C KC 3S JD 8D 8S TS QS KH",
    "8S QS 8D 6C TH AC AH 2C 8H 9S",
    "7H TD KH QH 8S 3D 4D AH JD AS",
    "TS 3D 2H JC 2S JH KH 6C QC JS",
    "KC TH 2D 6H 7S 2S TC 8C 9D QS",
    "3C 9D 6S KH 8H 6D 5D TH 2C 2H",
    "6H TC 7D AD 4D 8S TS 9H TD 7S",
    "JS 6D JD JC 2H AC 6C 3D KH 8D",
    "KH JD 9S 5D 4H 4C 3H 7S QS 5C",
    "4H JD 5D 3S 3C 4D KH QH QS 7S",
    "JD TS 8S QD AH 4C 6H 3S 5S 2C",
    "QS 3D JD AS 8D TH 7C 6S QC KS",
    "7S 2H 8C QC 7H AC 6D 2D TH KH",
    "5S 6C 7H KH 7D AH 8C 5C 7S 3D",
    "3C KD AD 7D 6C 4D KS 2D 8C 4S",
    "7C 8D 5S 2D 2S AH AD 2C 9D TD",
    "3C AD 4S KS JH 7C 5C 8C 9C TH",
    "AS TD 4D 7C JD 8C QH 3C 5H 9S",
    "3H 9C 8S 9S 6S QD KS AH 5H JH",
    "QC 9C 5S 4H 2H TD 7D AS 8C 9D",
    "8C 2C 9D KD TC 7S 3D KH QC 3C",
    "4D AS 4C QS 5S 9D 6S JD QH KS",
    "6D AH 6C 4C 5H TS 9H 7D 3D 5S",
    "QS JD 7C 8D 9C AC 3S 6S 6C KH",
    "8H JH 5D 9S 6D AS 6S 3S QC 7H",
    "QD AD 5C JH 2H AH 4H AS KC 2C",
    "JH 9C 2C 6H 2D JS 5D 9H KC 6D",
    "7D 9D KD TH 3H AS 6S QC 6H AD",
    "JD 4H 7D KC 3H JS 3C TH 3D QS",
    "4C 3H 8C QD 5H 6H AS 8H AD JD",
    "TH 8S KD 5D QC 7D JS 5S 5H TS",
    "7D KC 9D QS 3H 3C 6D TS 7S AH",
    "7C 4H 7H AH QC AC 4D 5D 6D TH",
    "3C 4H 2S KD 8H 5H JH TC 6C JD",
    "4S 8C 3D 4H JS TD 7S JH QS KD",
    "7C QC KD 4D 7H 6S AD TD TC KH",
    "5H 9H KC 3H 4D 3D AD 6S QD 6H",
    "TH 7C 6H TS QH 5S 2C KC TD 6S",
    "7C 4D 5S JD JH 7D AC KD KH 4H",
    "7D 6C 8D 8H 5C JH 8S QD TH JD",
    "8D 7D 6C 7C 9D KD AS 5C QH JH",
    "9S 2C 8C 3C 4C KS JH 2D 8D 4H",
    "7S 6C JH KH 8H 3H 9D 2D AH 6D",
    "4D TC 9C 8D 7H TD KS TH KD 3C",
    "JD 9H 8D QD AS KD 9D 2C 2S 9C",
    "8D 3H 5C 7H KS 5H QH 2D 8C 9H",
    "2D TH 6D QD 6C KC 3H 3S AD 4C",
    "4H 3H JS 9D 3C TC 5H QH QC JC",
    "3D 5C 6H 3S 3C JC 5S 7S 2S QH",
    "AC 5C 8C 4D 5D 4H 2S QD 3C 3H",
    "2C TD AH 9C KD JS 6S QD 4C QC",
    "QS 8C 3S 4H TC JS 3H 7C JC AD",
    "5H 4D 9C KS JC TD 9S TS 8S 9H",
    "QD TS 7D AS AC 2C TD 6H 8H AH",
    "6S AD 8C 4S 9H 8D 9D KH 8S 3C",
    "QS 4D 2D 7S KH JS JC AD 4C 3C",
    "QS 9S 7H KC TD TH 5H JS AC JH",
    "6D AC 2S QS 7C AS KS 6S KH 5S",
    "6D 8H KH 3C QS 2H 5C 9C 9D 6C",
    "JS 2C 4C 6H 7D JC AC QD TD 3H",
    "4H QC 8H JD 4C KD KS 5C KC 7S",
    "6D 2D 3H 2S QD 5S 7H AS TH 6S",
    "AS 6D 8D 2C 8S TD 8H QD JC AH",
    "9C 9H 2D TD QH 2H 5C TC 3D 8H",
    "KC 8S 3D KH 2S TS TC 6S 4D JH",
    "9H 9D QS AC KC 6H 5D 4D 8D AH",
    "9S 5C QS 4H 7C 7D 2H 8S AD JS",
    "3D AC 9S AS 2C 2D 2H 3H JC KH",
    "7H QH KH JD TC KS 5S 8H 4C 8D",
    "2H 7H 3S 2S 5H QS 3C AS 9H KD",
    "AD 3D JD 6H 5S 9C 6D AC 9S 3S",
    "3D 5D 9C 2D AC 4S 2S AD 6C 6S",
    "QC 4C 2D 3H 6S KC QH QD 2H JH",
    "QC 3C 8S 4D 9S 2H 5C 8H QS QD",
    "6D KD 6S 7H 3S KH 2H 5C JC 6C",
    "3S 9S TC 6S 8H 2D AD 7S 8S TS",
    "3C 6H 9C 3H 5C JC 8H QH TD QD",
    "3C JS QD 5D TD 2C KH 9H TH AS",
    "9S TC JD 3D 5C 5H AD QH 9H KC",
    "TC 7H 4H 8H 3H TD 6S AC 7C 2S",
    "QS 9D 5D 3C JC KS 4D 6C JH 2S",
    "9S 6S 3C 7H TS 4C KD 6D 3D 9C",
    "2D 9H AH AC 7H 2S JH 3S 7C QC",
    "QD 9H 3C 2H AC AS 8S KD 8C KH",
    "2D 7S TD TH 6D JD 8D 4D 2H 5S",
    "8S QH KD JD QS JH 4D KC 5H 3S",
    "3C KH QC 6D 8H 3S AH 7D TD 2D",
    "5S 9H QH 4S 6S 6C 6D TS TH 7S",
    "6C 4C 6D QS JS 9C TS 3H 8D 8S",
    "JS 5C 7S AS 2C AH 2H AD 5S TC",
    "KD 6C 9C 9D TS 2S JC 4H 2C QD",
    "QS 9H TC 3H KC KS 4H 3C AD TH",
    "KH 9C 2H KD 9D TC 7S KC JH 2D",
    "7C 3S KC AS 8C 5D 9C 9S QH 3H",
    "2D 8C TD 4C 2H QC 5D TC 2C 7D",
    "KS 4D 6C QH TD KH 5D 7C AD 8D",
    "2S 9S 8S 4C 8C 3D 6H QD 7C 7H",
    "6C 8S QH 5H TS 5C 3C 4S 2S 2H",
    "8S 6S 2H JC 3S 3H 9D 8C 2S 7H",
    "QC 2C 8H 9C AC JD 4C 4H 6S 3S",
    "3H 3S 7D 4C 9S 5H 8H JC 3D TC",
    "QH 2S 2D 9S KD QD 9H AD 6D 9C",
    "8D 2D KS 9S JC 4C JD KC 4S TH",
    "KH TS 6D 4D 5C KD 5H AS 9H AD",
    "QD JS 7C 6D 5D 5C TH 5H QH QS",
    "9D QH KH 5H JH 4C 4D TC TH 6C",
    "KH AS TS 9D KD 9C 7S 4D 8H 5S",
    "KH AS 2S 7D 9D 4C TS TH AH 7C",
    "KS 4D AC 8S 9S 8D TH QH 9D 5C",
    "5D 5C 8C QS TC 4C 3D 3S 2C 8D",
    "9D KS 2D 3C KC 4S 8C KH 6C JC",
    "8H AH 6H 7D 7S QD 3C 4C 6C KC",
    "3H 2C QH 8H AS 7D 4C 8C 4H KC",
    "QD 5S 4H 2C TD AH JH QH 4C 8S",
    "3H QS 5S JS 8H 2S 9H 9C 3S 2C",
    "6H TS 7S JC QD AC TD KC 5S 3H",
    "QH AS QS 7D JC KC 2C 4C 5C 5S",
    "QH 3D AS JS 4H 8D 7H JC 2S 9C",
    "5D 4D 2S 4S 9D 9C 2D QS 8H 7H",
    "6D 7H 3H JS TS AC 2D JH 7C 8S",
    "JH 5H KC 3C TC 5S 9H 4C 8H 9D",
    "8S KC 5H 9H AD KS 9D KH 8D AH",
    "JC 2H 9H KS 6S 3H QC 5H AH 9C",
    "5C KH 5S AD 6C JC 9H QC 9C TD",
    "5S 5D JC QH 2D KS 8H QS 2H TS",
    "JH 5H 5S AH 7H 3C 8S AS TD KH",
    "6H 3D JD 2C 4C KC 7S AH 6C JH",
    "4C KS 9D AD 7S KC 7D 8H 3S 9C",
    "7H 5C 5H 3C 8H QC 3D KH 6D JC",
    "2D 4H 5D 7D QC AD AH 9H QH 8H",
    "KD 8C JS 9D 3S 3C 2H 5D 6D 2S",
    "8S 6S TS 3C 6H 8D 5S 3H TD 6C",
    "KS 3D JH 9C 7C 9S QS 5S 4H 6H",
    "7S 6S TH 4S KC KD 3S JC JH KS",
    "7C 3C 2S 6D QH 2C 7S 5H 8H AH",
    "KC 8D QD 6D KH 5C 7H 9D 3D 9C",
    "6H 2D 8S JS 9S 2S 6D KC 7C TC",
    "KD 9C JH 7H KC 8S 2S 7S 3D 6H",
    "4H 9H 2D 4C 8H 7H 5S 8S 2H 8D",
    "AD 7C 3C 7S 5S 4D 9H 3D JC KH",
    "5D AS 7D 6D 9C JC 4C QH QS KH",
    "KD JD 7D 3D QS QC 8S 6D JS QD",
    "6S 8C 5S QH TH 9H AS AC 2C JD",
    "QC KS QH 7S 3C 4C 5C KC 5D AH",
    "6C 4H 9D AH 2C 3H KD 3D TS 5C",
    "TD 8S QS AS JS 3H KD AC 4H KS",
    "7D 5D TS 9H 4H 4C 9C 2H 8C QC",
    "2C 7D 9H 4D KS 4C QH AD KD JS",
    "QD AD AH KH 9D JS 9H JC KD JD",
    "8S 3C 4S TS 7S 4D 5C 2S 6H 7C",
    "JS 7S 5C KD 6D QH 8S TD 2H 6S",
    "QH 6C TC 6H TD 4C 9D 2H QC 8H",
    "3D TS 4D 2H 6H 6S 2C 7H 8S 6C",
    "9H 9D JD JH 3S AH 2C 6S 3H 8S",
    "2C QS 8C 5S 3H 2S 7D 3C AD 4S",
    "5C QC QH AS TS 4S 6S 4C 5H JS",
    "JH 5C TD 4C 6H JS KD KH QS 4H",
    "TC KH JC 4D 9H 9D 8D KC 3C 8H",
    "2H TC 8S AD 9S 4H TS 7H 2C 5C",
    "4H 2S 6C 5S KS AH 9C 7C 8H KD",
    "TS QH TD QS 3C JH AH 2C 8D 7D",
    "5D KC 3H 5S AC 4S 7H QS 4C 2H",
    "3D 7D QC KH JH 6D 6C TD TH KD",
    "5S 8D TH 6C 9D 7D KH 8C 9S 6D",
    "JD QS 7S QC 2S QH JC 4S KS 8D",
    "7S 5S 9S JD KD 9C JC AD 2D 7C",
    "4S 5H AH JH 9C 5D TD 7C 2D 6S",
    "KC 6C 7H 6S 9C QD 5S 4H KS TD",
    "6S 8D KS 2D TH TD 9H JD TS 3S",
    "KH JS 4H 5D 9D TC TD QC JD TS",
    "QS QD AC AD 4C 6S 2D AS 3H KC",
    "4C 7C 3C TD QS 9C KC AS 8D AD",
    "KC 7H QC 6D 8H 6S 5S AH 7S 8C",
    "3S AD 9H JC 6D JD AS KH 6S JH",
    "AD 3D TS KS 7H JH 2D JS QD AC",
    "9C JD 7C 6D TC 6H 6C JC 3D 3S",
    "QC KC 3S JC KD 2C 8D AH QS TS",
    "AS KD 3D JD 8H 7C 8C 5C QD 6C"
};

/************************************************************************/
/* Card */
/************************************************************************/
class Card
{
public:
    UINT32 Num;
    unsigned char Suit;

    //************************************
    // Method:    Card
    // Access:    public
    // Describe:  从string的index处获取一张牌
    // Parameter: const string & cards
    // Parameter: UINT32 index
    // Returns:
    //************************************
    Card(const string &cards, UINT32 index);

    //************************************
    // Method:    GetNum
    // Access:    public
    // Describe:  获取牌面数字,转换JQKA为数字11,12,13,14
    // Parameter: char numCh
    // Returns:   UINT32
    //************************************
    static UINT32 GetNum(char numCh);

    //************************************
    // Method:    GetSuit
    // Access:    public
    // Describe:  获取牌的花色
    // Parameter: unsigned char suitCh
    // Returns:   unsigned char
    //************************************
    unsigned char GetSuit(unsigned char suitCh);

    //************************************
    // Method:    operator<
    // Access:    public
    // Describe:  实现比较大小
    // Parameter: const Card & rightCard
    // Returns:
    //************************************
    bool operator<(const Card &rightCard);
};

Card::Card(const string &cards, UINT32 index)
{
    if(cards.length() < index + 2)
    {
        throw string("没有足够的牌!");
    }

    Num = Card::GetNum(cards[index]);
    Suit = GetSuit(cards[index + 1]);
}

UINT32 Card::GetNum(char numCh)
{
    const static string CH_TO_NUM = "  23456789TJQKA";

    for(INT32 i = CH_TO_NUM.length() - 1; i >= 2; --i)
    {
        if(CH_TO_NUM[i] == numCh)
        {
            return i;
        }
    }

    stringstream ss;
    ss << "牌面数值错误:" << numCh;
    throw string(ss.str());
}

unsigned char Card::GetSuit(unsigned char suitCh)
{
    const static string CH_TO_SUIT = "HCSD";

    for(INT32 i = CH_TO_SUIT.length() - 1; i >= 0; --i)
    {
        if(CH_TO_SUIT[i] == suitCh)
        {
            return suitCh;
        }
    }

    throw string("牌面花色错误!");
}

bool Card::operator<(const Card &rightCard)
{
    if(this->Num < rightCard.Num)
    {
        return true;
    }

    if(this->Num == rightCard.Num)
    {
        return this->Suit < rightCard.Suit;
    }

    return false;
}

/************************************************************************/
/* Hand */
/************************************************************************/
class Hand
{
public:
    const static UINT32 CARD_NUM = 5;                   // 手牌数目
    static const UINT32 MIN_LENGTH = 3 * CARD_NUM - 1;  // 一手牌最小长度
    vector  cards;                                // 手牌

    // 牌的类型
    enum HandType
    {
        HighCard,       // Highest value card.
        OnePair,        // Two cards of the same value.
        TwoPairs,       // Two different pairs.
        ThreeOfAKind,   // Three cards of the same value.
        Straight,       // All cards are consecutive values.
        Flush,          // All cards of the same suit.
        FullHouse,      // Three of a kind and a pair.
        FourOfAKind,    // Four cards of the same value.
        StraightFlush,  // All cards are consecutive values of same suit.
        RoyalFlush,     // Ten, Jack, Queen, King, Ace, in same suit.
        MAX_HAND_TYPE
    };

    //************************************
    // Method:    IsHighCard
    // Access:    public
    // Describe:  找到最大数值的牌
    // Returns:   bool
    //************************************
    bool IsHighCard(vector &cardPara)const;

    //************************************
    // Method:    IsOnePair
    // Access:    public
    // Describe:  找到最大一对数值相同的
    // Parameter: vector & cardPara
    // Returns:   bool
    //************************************
    bool IsOnePair(vector &cardPara)const;

    //************************************
    // Method:    IsTwoPairs
    // Access:    public
    // Describe:  找到最大的两对数值相同的牌
    // Parameter: vector & cardPara
    // Returns:   bool
    //************************************
    bool IsTwoPairs(vector &cardPara)const;

    //************************************
    // Method:    IsThreeOfAKind
    // Access:    public
    // Describe:  找到最大的3张数值相同的牌
    // Parameter: vector & cardPara
    // Returns:   bool
    //************************************
    bool IsThreeOfAKind(vector &cardPara)const;

    //************************************
    // Method:    IsStraight
    // Access:    public
    // Describe:  所有牌是否都是按顺序排列的
    // Parameter: vector & cardPara   记录数值最大的一张牌
    // Returns:   bool
    //************************************
    bool IsStraight(vector &cardPara)const;

    //************************************
    // Method:    IsFlush
    // Access:    public
    // Describe:  所有牌是否都是同花色
    // Parameter: vector & cardPara   记录面值最大的一张牌
    // Returns:   bool
    //************************************
    bool IsFlush(vector &cardPara)const;

    //************************************
    // Method:    IsFullHouse
    // Access:    public
    // Describe:  是否是2张和3张的组合
    // Parameter: vector & cardPara   记录一张3张同值牌和一张2张同值牌,3张的牌放在索引0的位置
    // Returns:   bool
    //************************************
    bool IsFullHouse(vector &cardPara)const;

    //************************************
    // Method:    IsFourOfAKind
    // Access:    public
    // Describe:  是否有4张相同的牌
    // Parameter: vector & cardPara   记录4张牌中花色最大的一张
    // Returns:   bool
    //************************************
    bool IsFourOfAKind(vector &cardPara)const;

    //************************************
    // Method:    IsStraightFlush
    // Access:    public
    // Describe:  是否是同花顺
    // Parameter: vector & cardPara   记录数值最大的一张牌
    // Returns:   bool
    //************************************
    bool IsStraightFlush(vector &cardPara)const;

    //************************************
    // Method:    IsRoyalFlush
    // Access:    public
    // Describe:  是否是最大同花顺(面值为:T,J,Q,K,A)
    // Parameter: vector & cardPara   记录A
    // Returns:   bool
    //************************************
    bool IsRoyalFlush(vector &cardPara)const;

    //************************************
    // Method:    Hand
    // Access:    public
    // Describe:  创建一个Hand
    // Parameter: const string & handStr    格式:"AS KD 3D JD 8H"
    // Returns:
    //************************************
    Hand(const string &handStr);

    //************************************
    // Method:    Replace
    // Access:    public
    // Describe:  重新创建一个Hand
    // Parameter: const string & handStr
    // Returns:   void
    //************************************
    void Replace(const string &handStr);

    //************************************
    // Method:    GetHandType
    // Access:    public
    // Describe:  获取此手牌的组合类型
    // Parameter: vector & cardPara   组合类型参数,用于同类型比较大小
    // Returns:   Hand::HandType
    //************************************
    HandType GetHandType(vector &cardPara)const;

    //************************************
    // Method:    operator<
    // Access:    public
    // Describe:  比较2套手牌的大小
    // Parameter: const Hand & rightHand
    // Returns:   bool
    //************************************
    bool operator<(const Hand &rightHand)const;
    bool operator>(const Hand &rightHand)const;
    bool operator==(const Hand &rightHand)const;

private:
    //************************************
    // Method:    TYPE_FUN
    // Access:    private
    // Describe:  手牌类型函数指针
    // Parameter: vector &cardPara    相关联的牌
    //************************************
    typedef bool (Hand::*TYPE_FUN)(vector &cardPara) const;

    static TYPE_FUN typeFun[MAX_HAND_TYPE];
};

Hand::TYPE_FUN Hand::typeFun[MAX_HAND_TYPE] =
{
    &Hand::IsHighCard,
    &Hand::IsOnePair,
    &Hand::IsTwoPairs,
    &Hand::IsThreeOfAKind,
    &Hand::IsStraight,
    &Hand::IsFlush,
    &Hand::IsFullHouse,
    &Hand::IsFourOfAKind,
    &Hand::IsStraightFlush,
    &Hand::IsRoyalFlush
};

Hand::Hand(const string &handStr)
{
    if(handStr.length() < MIN_LENGTH)
    {
        throw string("手牌格式错误!");
    }

    cards.clear();
    for(UINT32 i = 0; i < CARD_NUM; ++i)
    {
        cards.push_back(Card(handStr, i * 3));
    }

    sort(cards.begin(), cards.end());
}

void Hand::Replace(const string &handStr)
{
    *this = Hand(handStr);
}

bool Hand::IsHighCard(vector &cardPara)const
{
    cardPara.clear();
    cardPara.push_back(cards[CARD_NUM - 1]); // 最后一个数是最大值

    return true;
}

bool Hand::IsOnePair(vector &cardPara) const
{
    // 从大往小寻找
    for(INT32 i = CARD_NUM - 1; i >= 1; --i)
    {
        // 有一对数值相同
        if(cards[i].Num == cards[i - 1].Num)
        {
            cardPara.clear();
            cardPara.push_back(cards[i]);

            return true;
        }
    }

    return false;
}

bool Hand::IsTwoPairs(vector &cardPara) const
{
    UINT32 pairsCount = 0;

    cardPara.clear();

    // 从大往小寻找
    for(INT32 i = CARD_NUM - 1; i >= 1; --i)
    {
        // 有一对数值相同
        if(cards[i].Num == cards[i - 1].Num)
        {
            cardPara.push_back(cards[i]);
            --i;

            ++pairsCount;

            if(pairsCount == 2)
            {
                return true;
            }
        }
    }

    return false;
}

bool Hand::IsThreeOfAKind(vector &cardPara) const
{
    // 从大往小寻找
    for(INT32 i = CARD_NUM - 1; i >= 2; --i)
    {
        // 有3张数值相同
        if(cards[i].Num == cards[i - 1].Num && cards[i].Num == cards[i - 2].Num)
        {
            cardPara.clear();
            cardPara.push_back(cards[i]);

            return true;
        }
    }

    return false;
}

bool Hand::IsStraight(vector &cardPara) const
{
    // 从大往小寻找
    for(INT32 i = CARD_NUM - 1; i >= 1; --i)
    {
        // 数值不为顺序的结果
        if(cards[i].Num - 1 != cards[i - 1].Num)
        {
            return false;
        }
    }

    cardPara.clear();
    cardPara.push_back(cards[CARD_NUM - 1]); // 记录最大的牌

    return true;
}

bool Hand::IsFlush(vector &cardPara) const
{
    // 从小往大寻找
    for(INT32 i = 1; i < CARD_NUM ; ++i)
    {
        // 花色不同
        if(cards[i - 1].Suit != cards[i].Suit)
        {
            return false;
        }
    }

    cardPara.clear();
    cardPara.push_back(cards[CARD_NUM - 1]); // 记录数值最大的牌

    return true;
}

bool Hand::IsFullHouse(vector &cardPara) const
{
    if(cards[0].Num == cards[1].Num && cards[3].Num == cards[4].Num)
    {
        if(cards[2].Num == cards[1].Num)
        {
            cardPara.clear();
            cardPara.push_back(cards[2]);
            cardPara.push_back(cards[4]);

            return true;
        }

        if(cards[2].Num == cards[3].Num)
        {
            cardPara.clear();
            cardPara.push_back(cards[4]);
            cardPara.push_back(cards[1]);

            return true;
        }
    }

    return false;
}

bool Hand::IsFourOfAKind(vector &cardPara) const
{
    UINT32 sameCount = 0;   // 相同的牌的张数

    // 从大往小寻找
    for(INT32 i = CARD_NUM - 1; i >= 1; --i)
    {
        // 与前一张数值相同
        if(cards[i].Num == cards[i - 1].Num)
        {
            ++sameCount;

            if(sameCount == 4)
            {
                cardPara.clear();
                cardPara.push_back(cards[i + 3]);

                return true;
            }
        }
    }

    return false;
}

bool Hand::IsStraightFlush(vector &cardPara) const
{
    return IsFlush(cardPara) && IsStraight(cardPara);
}

bool Hand::IsRoyalFlush(vector &cardPara) const
{
    if(IsStraightFlush(cardPara))
    {
        return cardPara[0].Num == Card::GetNum('A');
    }

    return false;
}

Hand::HandType Hand::GetHandType(vector &cardPara) const
{
    for(INT32 handType = MAX_HAND_TYPE - 1; handType >= 0; --handType)
    {
        // 这里是高端用法啊,查了半天啊有木有!this不可省略!
        if((this->*typeFun[handType])(cardPara))
        {
            return (HandType)handType;
        }
    }

    return MAX_HAND_TYPE;
}

bool Hand::operator<(const Hand &rightHand) const
{
    vector thisHandCard;
    vector rightHandCard;

    HandType thisHandType;
    HandType rightHandType;

    thisHandType = this->GetHandType(thisHandCard);
    rightHandType = rightHand.GetHandType(rightHandCard);

    // cout << " : " << thisHandType << "-" << rightHandType << endl;

    if(thisHandType < rightHandType)
    {
        return true;
    }

    // 牌类型相同
    if(thisHandType == rightHandType)
    {
        // 比较参数
        UINT32 handCardSize = thisHandCard.size();
        for(UINT32 handCardIndex = 0; handCardIndex < handCardSize; ++handCardIndex)
        {
            if(thisHandCard[handCardIndex].Num < rightHandCard[handCardIndex].Num)
            {
                return true;
            }

            if(thisHandCard[handCardIndex].Num > rightHandCard[handCardIndex].Num)
            {
                return false;
            }
        }

        // 参数相同,从大到小比较牌数值
        for(INT32 cardIndex = CARD_NUM - 1; cardIndex >= 0; --cardIndex)
        {
            if(cards[cardIndex].Num < rightHand.cards[cardIndex].Num)
            {
                return true;
            }

            if(cards[cardIndex].Num > rightHand.cards[cardIndex].Num)
            {
                return false;
            }
        }

        // 数值都一样
        return false;
    }

    return false;
}

bool Hand::operator>(const Hand &rightHand) const
{
    return rightHand < *this;
}

bool Hand::operator==(const Hand &rightHand) const
{
    return (!(*this < rightHand)) && (!(rightHand < *this));
}

void TestFun1()
{

    cout << "TestFun1 OK!" << endl;
}

void F1()
{
    cout << "void F1()" << endl;

    // TestFun1();

    DetailPrinter detailPrinter;
    detailPrinter.Start();

    /*********************************算法开始*******************************/

    try
    {
        UINT32 player1WinCount = 0;
        UINT32 size = ARRAYSIZE(GAME_CARDS);

        for(UINT32 i = 0; i < size; ++i)
        {
            Hand hand1(GAME_CARDS[i]);
            Hand hand2(GAME_CARDS[i].substr(Hand::MIN_LENGTH + 1));

            // cout << "[" << i << "]" << GAME_CARDS[i];

            if(hand1 > hand2)
            {
                ++player1WinCount;
            }
        }

        cout << "玩家1胜利的次数为" << player1WinCount << endl;
    }
    catch(const string &msg)
    {
        cout << "发生错误:" << msg << endl;
    }
    catch(...)
    {
        cout << "发生错误!" << endl;
    }

    /*********************************算法结束*******************************/

    detailPrinter.End();
}

//主函数
int main()
{
    F1();
    return 0;
}

/*
void F1()
玩家1胜利的次数为376
Total Milliseconds is 91.1985

By GodMoon
Sun Apr 21 18:29:49 2013
*/


 

你可能感兴趣的:(【C/C++】,【ProjectEuler】)