1. 程式人生 > >炸金花【大模擬】

炸金花【大模擬】

大模擬(ptgiving)

問題背景

​ 眾所周知, \(xkj\)\(GH\)的得意門生,可是 \(xkj\) 的數學成績並不是很理想,每次\(GH\)在批評完數學限訓做的差的人後,總會在後面加上一句,咱們班還有一位做的最差的同學——\(xkj\),你看看你還有對號嗎,居然比 \(cdy\) 做得還差!

\(xkj\)當然是不服的啦,當場跟\(GH\) \(van♂\)硬幣。在玩完硬幣後,生成了一系列隨機的亂七八糟的數字,並把他們整列成科學計數法的形式,並排序成有序的序列,還計算出排序的最小成本之後,終於,從桌堂裡掏出了一本古老的小黃書——來自\(c。\)的透徹祕籍。這是\(xkj、c。\)

\(cdy\)在學\(gxt\)\(lsq\)做生意時偷偷找到的祕籍,被\(c。\)私吞了,今天\(xkj\)冒著風險偷了過來,並偷偷地傳給了\(cdy\),就去跳瑰麗華爾茲去了。

問題描述

\(cdy\)自從拿到了小黃書之後就興奮地不得了,三天後終於有時間在站級部且mt不在的時候和xiaoY一起透徹這本小黃書。(然而此時\(xk\)j的靈魂已經飄到了食堂)

​ 開啟一看,這本小黃書裡竟然有一個奇怪的遊戲。由於這本書是c。珍藏的,太古老了已經破爛不堪了,所以cdy只知道這個遊戲是用黑桃、紅心、梅花和方片,A到K的52張牌(不包含大貓和小貓)的進行撲克牌遊戲。

​ 由於這本書已經破爛不堪,中間描述遊戲規則的部分已經被扯成ghj1222的頭像那樣了,cdy只看到了“每個人的手牌上限有5張”這個資訊,所以cdy和xy決定每個人發五張牌,並判定誰的手牌比較大。這本小黃書中規定手牌大小判定的資訊如下:

​ 所有五張牌的組合,按以下順序,由大到小排行分為不同牌型:

編號 名稱 英文名稱 描述 舉例
1 同花順 Straight Flush 同一花色順序的牌。 \(\color{red}{Q♦ J♦ 10♦ 9♦ 8♦}\)
2 四條 Four of a Kind 有四張同一點數的牌。 10♣ \(\color{red}{10♦ 10♥}\) 10♠ \(\color{red}{9♥}\)
3 滿堂紅 Full House 三張同一點數的牌,加一對其它點數的牌。 8♣ \(\color{red}{8♦}\) 8♠ \(\color{red}{K♥}\) K♠
4 同花 Flush 五張同一花色的牌。 A♠ K♠ 10♠ 9♠ 8♠
5 順子 Straight 五張順序的牌。 \(\color{red}{K♦ Q♥}\) J♠ \(\color{red}{10♦ 9♦}\)
6 三條 Three of a kind 有三張同一點數的牌。 J♣\(\color{red}{ J♥}\) J♠ \(\color{red}{K♦}\) 9♠
7 兩對 Two Pairs 兩張相同點數的牌,加另外兩張相同點數的牌。 A♣ \(\color{red}{A♦ 8♥}\) 8♠ Q♠
8 一對 One Pair 兩張相同點數的牌。 \(\color{red}{9♥}\) 9♠ A♣ J♠ \(\color{red}{8♥}\)
9 無對 Zilch 不能排成以上組合的牌。 \(\color{red}{A♦ Q♦}\) J♠ 9♣ 8♣

備註:和某知名遊戲《鬥地主》類似的,10 J Q K A可以組成順子,但是J Q K A 2不能組成。不過和《鬥地主》不同的是,A 2 3 4 5和2 3 4 5 6也可以組成順子。我們認為A 2 3 4 5是順子中最小的一個,而10 J Q K A是順子中最大的一個。

​ 比較兩組牌的大小時,先按照上述規則比較大小,牌型編號小的牌組大。如果兩組牌的牌型編號相同,那麼按照牌型內牌的重要程度排序,同等重要程度的按照牌型大小排序,按照順序比較牌的大小,牌大的牌組大。

對於兩組牌的比較,點數優先,花色在後。(先比較所有牌的大小,若全部相同再比較花色。)

​ 點數的順序為:A>K>Q>J>10>9>8>7>6>5>4>3>2。

​ 注意:當五張手牌為5 4 3 2 A時,A可以看做最小的牌。此時牌型仍為順子,是順子裡面最小的一個。

​ 花色的順序為:黑桃(♠)>紅心(♥)>梅花(♣)>方塊(♦)。

舉例說明:

1、\(\color{red}{Q♦ J♦ 10♦ 9♦ 8♦}\) > 8♣ 8♥ 8♠ K♥ K♠ (前者牌型為同花順,比後者大);

2、9♣ \(\color{red}{9♦}\) 9♠ \(\color{red}{Q♥}\) Q♠ > 8♣ \(\color{red}{8♦}\) 8♠ \(\color{red}{K♥}\) K♠ (兩者牌型均為滿堂紅,比較牌型中三張同一點數的牌9比8大);

3、A♣ \(\color{red}{A♦ 8♥}\) 8♠ Q♠ > A♠\(\color{red}{A♥ 7♥}\) 7♠ K♠ (兩者牌型均為兩對,且最大的對子相同,此時比較次大的對子,8比7大);

4、A♠ Q♠\(\color{red}{ J♥ 9♥}\) 8♥ > \(\color{red}{A♦ Q♦}\) J♠ 9♣ 8♣ (兩者牌型均為無對,所有數碼均相同,此時比較最大牌的花色,A♠ > A♦)。

5、4♠ \(\color{red}{4♥ A♦ Q♦ 5♦}\) > 4♣ \(\color{red}{4♦}\) A♠ Q♠ 5♠ (兩者牌型均為一對,所有數碼均相同,此時對4為牌型裡最大的部分,因此比較兩個對4中最大的花色,即4♠ > 4♣)

由於級部門口比較危險,而\(cdy\)\(xy\)\(van♂\)這個遊戲,但他們希望你來判斷一下結果。

輸入格式

輸入的第一行包含一個正整數\(T\),表示有\(T\)組測試資料。

接下來有\(10*T\)行,每組測試資料包含\(10\)行。

每組資料的前\(5\)行每行用兩個整數描述一張\(cdy\)手上的牌。每行第一個數表示牌的數碼(\(1\)表示\(A\)\(11\)表示\(J\)\(12\)表示\(Q\)\(13\)表示\(K\)),第二個數表示牌的花色(\(1\)表示黑桃,\(2\)表示紅心,\(3\)表示梅花,\(4\)表示方塊)。

\(5\)行每行用兩個整數描述\(xy\)手上的牌,格式同上。

輸出格式

一共輸出\(T\)行,對於每組測試資料,輸出\(cdy\)或者\(xy\),表示誰的牌比較大。

輸入樣例1

1
1 3
5 3
4 3
3 3
2 3
6 1
10 4
7 1
8 1
9 2

輸出樣例1

cdy 

樣例解釋

​ cdy的手牌構成了同花順,而xy的手牌僅構成普通順子,所以cdy的手牌大於xy的。

輸入樣例2

2
2 4
7 4
12 4
4 4
13 4
6 3
5 2
3 4
4 3
2 1
12 3
11 1
10 3
8 3
9 3
2 1
7 1
6 1
13 1
5 1

輸出樣例2

cdy
xy

樣例解釋

第一組資料中\(cdy\)的手牌構成了同花而\(xy\)的手牌僅構成順子。

第二組資料中\(cdy\)的手牌構成了順子而\(xy\)的手牌構成了同花。

資料規模與約定

對於20%的資料,保證N=1。

對於另外30%的資料,保證輸入的全部牌型都是順子、同花或同花順。

對於另外10%的資料,保證輸入的全部牌型都是無對。

對於100%的資料,保證N<=100000。

題解

這是我校大佬\(rqj\)出的題(題目來源:Nescafé 24 杯模擬賽)

好久沒做大模擬了,快\(NOIP\)了,也應該練練手了。

\(c。\)\(debug\)了3個小時,才改過。。。。

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ll long long
#define R register
#define debug cout<<"fuck"<<endl
using namespace std;
template<typename T>inline void read(T &a){
    char c=getchar();T x=0,f=1;
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    a=f*x;
}
int T,level[5],ed[5],tong[3][20],san[5],si[5],dui[5];
int sanpai[5],sipai[5],duipai[5][5],jian[5],jian_col[5];
struct node{
    int x,col;
    friend bool operator < (const node &a,const node &b){
        if(a.x==b.x)return a.col<b.col;
        return a.x>b.x;
    }
}cdy[10],xy[10];
inline bool tongshun(R node a[]){
    R int color=a[1].col;
    if(a[5].x==1&&a[1].x==13&&a[2].x==12&&a[3].x==11&&a[4].x==10&&a[2].col==color&&a[3].col==color&&a[4].col==color&&a[5].col==color)return 1;
    for(R int i=2;i<=5;i++){
        if(a[i].col!=color)return 0;
        if(a[i].x-a[i-1].x!=-1)return 0;
    }
    return 1;
}
inline bool four(R int o){
    if(si[o])return 1;
    return 0;
}
inline bool fullred(R int o){
    if(dui[o]&&san[o])return 1;
    return 0;
}
inline bool samecol(R node a[]){
    R int color=a[1].col;
    for(R int i=2;i<=5;i++)
        if(a[i].col!=color)return 0;
    return 1;
}
inline bool shunzi(R node a[]){
    if(a[5].x==1&&a[1].x==13&&a[2].x==12&&a[3].x==11&&a[4].x==10)return 1;
    for(R int i=2;i<=5;i++)
        if(a[i].x-a[i-1].x!=-1)return 0;
    return 1;
}
inline bool three(R int o){
    return san[o];
}
inline int cmp_num(){
    for(R int i=1;i<=5;i++){
        if(cdy[i].x>xy[i].x)return 1;
        else if(cdy[i].x<xy[i].x)return 0;
    }
    return 2;
}
inline int cmp_col(){
    if(cdy[5].x==1&&xy[5].x==1&&cdy[1].x==13&&cdy[5].col<xy[5].col)return 1;
    else if(cdy[5].x==1&&xy[5].x==1&&xy[1].x==13&&cdy[5].col>xy[5].col)return 0;
    for(R int i=1;i<=5;i++){
        if(cdy[i].col<xy[i].col)return 1;
        else if(cdy[i].col>xy[i].col)return 0;
    }
}
inline int cmp3(){
    R int res1=0,res2=0;
    for(R int i=1;i<=5;i++){
        if(cdy[i].x!=duipai[1][1]&&cdy[i].x!=duipai[1][2])res1=cdy[i].x;
        if(xy[i].x!=duipai[2][1]&&xy[i].x!=duipai[2][2])res2=xy[i].x;
    }
    if(res1>res2)return 1;
    else if(res1<res2)return 0;
    return 2;
}
inline int cmp2(){
    int u[10],v[10],l1=0,l2=0;
    for(R int i=1;i<=5;i++){
        if(cdy[i].x!=duipai[1][1])u[++l1]=cdy[i].x;
        if(xy[i].x!=duipai[2][1])v[++l2]=xy[i].x;
    }
    for(R int i=1;i<=3;i++){
        if(u[i]>v[i])return 1;
        else if(u[i]<v[i])return 0;
    }
    return 2;
}
int main(){
    freopen("ptgiving.in","r",stdin);
    freopen("ptgiving.out","w",stdout);
    read(T);
    while(T--){
        level[1]=level[2]=1;ed[1]=ed[2]=0;
        for(R int i=1;i<=13;i++)tong[1][i]=tong[2][i]=0;
        dui[1]=san[1]=si[1]=dui[2]=san[2]=si[2]=0;si[1]=si[2]=0;
        sanpai[1]=sipai[1]=duipai[1][1]=sanpai[2]=sipai[2]=duipai[1][2]=0;
        duipai[2][1]=duipai[2][2]=0;jian[1]=jian[2]=0;
        jian_col[1]=jian_col[2]=0;
        //上面是預處理 
        for(R int i=1;i<=5;i++){
            read(cdy[i].x),read(cdy[i].col),tong[1][cdy[i].x]++;
            if(cdy[i].x==1)jian[1]=1,jian_col[1]=cdy[i].col;
        }
        for(R int i=1;i<=5;i++){
            read(xy[i].x),read(xy[i].col),tong[2][xy[i].x]++;
            if(xy[i].x==1)jian[2]=1,jian_col[2]=xy[i].col;
        }
        for(R int i=1;i<=13;i++){
            if(tong[1][i]==2)dui[1]++,duipai[1][dui[1]]=i;
            if(tong[1][i]==3)san[1]++,sanpai[1]=i;
            if(tong[1][i]==4)si[1]++,sipai[1]=i;
            if(tong[2][i]==2)dui[2]++,duipai[2][dui[2]]=i;
            if(tong[2][i]==3)san[2]++,sanpai[2]=i;
            if(tong[2][i]==4)si[2]++,sipai[2]=i;
        }
        sort(cdy+1,cdy+6);sort(xy+1,xy+6);
        //同花順
        if(tongshun(cdy))level[1]=9,ed[1]=1;
        if(tongshun(xy))level[2]=9,ed[2]=1;
        //四條
        if(!ed[1]&&four(1))level[1]=8,ed[1]=1;
        if(!ed[2]&&four(2))level[2]=8,ed[2]=1;
        //滿堂紅
        if(!ed[1]&&fullred(1))level[1]=7,ed[1]=1;
        if(!ed[2]&&fullred(2))level[2]=7,ed[2]=1;
        //同花
        if(!ed[1]&&samecol(cdy))level[1]=6,ed[1]=1;
        if(!ed[2]&&samecol(xy))level[2]=6,ed[2]=1;
        //順子
        if(!ed[1]&&shunzi(cdy))level[1]=5,ed[1]=1;
        if(!ed[2]&&shunzi(xy))level[2]=5,ed[2]=1;
        //三條
        if(!ed[1]&&three(1))level[1]=4,ed[1]=1;
        if(!ed[2]&&three(2))level[2]=4,ed[2]=1;
        //兩對
        if(!ed[1]&&dui[1]==2)level[1]=3,ed[1]=1;
        if(!ed[2]&&dui[2]==2)level[2]=3,ed[2]=1;
        //一對
        if(!ed[1]&&dui[1]==1)level[1]=2,ed[1]=1;
        if(!ed[2]&&dui[2]==1)level[2]=2,ed[2]=1;
        //先比較牌的形式 
        if(level[1]>level[2])puts("cdy");
        else if(level[1]<level[2])puts("xy");
        //下面是噁心的對比相同形式的牌 
        else{
            if(level[1]==9){
                if(jian[1]&&!jian[2])puts("cdy");
                else if(!jian[1]&&jian[2])puts("xy");
                else{
                    if(cmp_num()==1)puts("cdy");
                    else if(cmp_num()==0)puts("xy");
                    else{
                        if(cmp_col()==1)puts("cdy");
                        else puts("xy");
                    }
                }
            }
            else if(level[1]==8){
                if(sipai[1]==1&&sipai[2]!=1)puts("cdy");
                else if(sipai[1]!=1&&sipai[2]==1)puts("xy");
                else{
                    if(sipai[1]>sipai[2])puts("cdy");
                    else puts("xy");
                }
            }
            else if(level[1]==7){
                if(sanpai[1]==1&&sanpai[2]!=1)puts("cdy");
                else if(sanpai[1]!=1&&sanpai[2]==1)puts("xy");
                else {
                    if(sanpai[1]>sanpai[2])puts("cdy");
                    else puts("xy");
                }
            }
            else if(level[1]==6){
                if(jian[1]&&!jian[2])puts("cdy");
                else if(!jian[1]&&jian[2])puts("xy");
                else{
                    if(cmp_num()==1)puts("cdy");
                    else if(cmp_num()==0)puts("xy");
                    else{
                        if(cmp_col())puts("cdy");
                        else puts("xy");
                    }
                }
            }
            else if(level[1]==5){
                if(cdy[5].x==1&&cdy[1].x==13&&xy[5].x!=1)puts("cdy");
                else if(xy[5].x==1&&xy[1].x==13&&cdy[5].x!=1)puts("xy");
                else{
                    if(cmp_num()==1)puts("cdy");
                    else if(cmp_num()==0)puts("xy");
                    else{
                        if(cmp_col())puts("cdy");
                        else puts("xy");
                    }
                }
            }
            else if(level[1]==4){
                if(sanpai[1]==1&&sanpai[2]!=1)puts("cdy");
                else if(sanpai[1]!=1&&sanpai[2]==1)puts("xy");
                else{
                    if(sanpai[1]>sanpai[2])puts("cdy");
                    else puts("xy");
                }
            }
            else if(level[1]==3){
                if(duipai[1][1]==1&&duipai[2][1]!=1)puts("cdy");
                else if(duipai[1][1]!=1&&duipai[2][1]==1)puts("xy");
                else{
                    if(duipai[1][2]>duipai[2][2])puts("cdy");
                    else if(duipai[1][2]<duipai[2][2])puts("xy");
                    else{
                        if(duipai[1][1]>duipai[2][1])puts("cdy");
                        else if(duipai[1][1]<duipai[2][1])puts("xy");
                        else{
                            if(jian[1]&&!jian[2])puts("cdy");
                            else if(!jian[1]&&jian[2])puts("xy");
                            else{
                                if(cmp3()==1)puts("cdy");
                                else if(cmp3()==0)puts("xy");
                                else{
                                    if(cmp_col()==1)puts("cdy");
                                    else puts("xy");
                                }
                            }
                        }
                    }
                }
            }
            else if(level[1]==2){
                if(duipai[1][1]==1&&duipai[2][1]!=1)puts("cdy");
                else if(duipai[1][1]!=1&&duipai[2][1]==1)puts("xy");
                else{
                    if(duipai[1][1]>duipai[2][1])puts("cdy");
                    else if(duipai[1][1]<duipai[2][1])puts("xy");
                    else {
                        if(jian[1]&&!jian[2])puts("cdy");
                        else if(!jian[1]&&jian[2])puts("xy");
                        else{
                            if(cmp2()==1)puts("cdy");
                            else if(cmp2()==0)puts("xy");
                            else{
                                if(cmp_col()==1)puts("cdy");
                                else puts("xy");
                            }
                        }
                    }
                }
            }
            else{
                if(jian[1]&&!jian[2])puts("cdy");
                else if(!jian[1]&&jian[2])puts("xy");
                else{
                    if(cmp_num()==1)puts("cdy");
                    else if(cmp_num()==0)puts("xy");
                    else{
                        if(jian[1]&&jian[2]){
                            if(jian_col[1]<jian_col[2])puts("cdy");
                            else puts("xy");
                            continue;
                        }
                        if(cmp_col()==1)puts("cdy");
                        else puts("xy");
                    }
                }
            }
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}