1. 程式人生 > >ZZULI - 小新三連(一):小新在打牌(模擬)

ZZULI - 小新三連(一):小新在打牌(模擬)

題目連結:http://acm.zzuli.edu.cn/problem.php?id=2481
時間限制: 1 Sec  記憶體限制: 128 MB

題目描述

一天小新感覺無聊,就去找他的朋友小新新和小新新新。經過商量,他們決定玩撲克牌,但普通的玩法他們覺得太無聊了,便制定了新的玩法,規則如下:
1.一副牌將大小王捨去,只用其餘的52張牌。A,2,3,4,5,6,7,8,9,10,J,Q,K分別代表點數為1,2,3,4,5,6,7,8,9,10,11,12,13。
2.先從牌堆中抽取一張牌,記錄該牌點數為M(該牌不放回),然後按小新新新,小新新,小新的順序輪流拿牌,每人總共拿三張牌。拿完後,將每個人牌的點數加起來,然後對M取餘,得到的點數即為最終的點數,最終點數最大的人即為贏家。
3.每局結束後會重新洗牌。
由於小新總是輸,所以小新新和小新新新決定明牌與小新打(但這是比大小,明不明牌有什麼關係嗎),當小新新新和小新新三張牌都拿完了,小新已經拿了兩張牌時,小新想知道自己是否有機會贏。

輸入

第一行輸入一個整數T(T<=1000),代表有T組資料。
每組資料第一行一張牌面,代表從牌堆中所抽取的那張牌。接下來兩行每行包含三張牌面,中間由空格分開,第一行代表小新新的牌面,第二行代表小新新新的牌面,最後一行包含兩張牌面(代表此時小新手裡的牌)和一個'?'(代表這張牌還未知)。牌面為A,2,3,4,5,6,7,8,9,10,J,Q,K中的一張。

輸出

對於每組資料輸出一行,如果小新可能贏,則輸出"I can win";如果在最好情況下,小新的點數可能與小新新或小新新新中點數較高的人點數一樣,輸出"I may not lose",如果小新的點數一定會比小新新或小新新新低,就輸定了,則輸出"I'm a loser"。

樣例輸入

2
K
5 2 4
9 A K
8 6 ?
Q
5 2 4
9 A K
6 6 ?

樣例輸出

I can win
I may not lose

解題思路

模擬一下打牌的過程就行了,先算出來小新新和小新新新點數最大的那一個max,並把他們抽取的牌給減掉(不放回)。最後遍歷十三種牌,看看有沒有一張牌能使小新的點數大於max,或等於max,最後輸出相應的結果。

#include <stdio.h>
int edge(char a[])
{
    if (a[0] >= '1' && a[0] <= '9')
    {
        if (a[1] != '0')
            return a[0] - '0';
        return 10;
    }
    switch(a[0])
    {
        case 'A': return 1;
        case 'J': return 11;
        case 'Q': return 12;
        case 'K': return 13;
    }
}
int main()
{
    char s[3];
    int t, m, q, maxn, temp, a[3], p[15];
    scanf("%d%*c", &t);
    while (t--)
    {
        a[0] = a[1] = a[2] = temp = 0;
        for (int i = 1; i <= 13; i++)
            p[i] = 4;
        scanf("%s", s);
        m = edge(s);
        p[m]--;
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                scanf("%s", &s);
                if (s[0] != '?')
                {
                    q = edge(s);
                    a[i] += q;
                    p[q]--;
                }
            }
        }
        a[0] %= m;
        a[1] %= m;
        maxn = a[0] > a[1] ? a[0] : a[1];
        for (int i = 1; i <= 13; i++)
        {
            if (p[i])
            {
                if ((a[2] + i) % m == maxn)
                    temp = 2;
                else if ((a[2] + i) % m > maxn)
                {
                    temp = 1;
                    break;
                }
            }
        }
        if (temp == 1)
            printf("I can win\n");
        else if (!temp)
            printf("I'm a loser\n");
        else printf("I may not lose\n");
    }
    return 0;
}