ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1488. ACM Poker

Where is the bug?!!!
Posted by Howl of Despair 5 Feb 2008 00:52
I don't know how this did happen... It's the first time I've been encountered with such a trouble... Everything seems to be correct, all "home" tests having passed, but... WA2
Somebody, please help me!

My code:
#include <cstdio>
#include <algorithm>
using namespace std;

struct Card
{
    int value;
    char color;
    Card(int value = 0, char color = 0) : value(value), color(color) {}
    bool in()
    {
        char c;
        while(1)
        {
            c = getchar();
            if(c == EOF)
                return false;
            if((c >= '1') && (c <= '9'))
                break;
            if(c == 'A' || c == 'J' || c == 'Q' || c == 'K')
                break;
            if(c >= 'A' && c <= 'Z')
                for(;;);
            if(c >= 'a' && c <= 'z')
                for(;;);
            if(c == '0')
                for(;;);
        }
        switch(c)
        {
            case '1':
                value = 10;
                getchar();
                break;
            case 'J':
                value = 11;
                break;
            case 'Q':
                value = 12;
                break;
            case 'K':
                value = 13;
                break;
            case 'A':
                value = 14;
                break;
            default:
                if(c < '1' || c > '9')
                    for(;;);
                value = c - '0';
        }
        color = getchar();
        if(!(color == 'H' || color == 'D' || color == 'S' || color == 'C'))
            for(;;);
        if(value < 1 || value > 14)
            for(;;);
        return true;
    }
};

bool operator<(Card c1, Card c2)
{
    return c1.value < c2.value;
}

bool operator==(Card c1, Card c2)
{
    return (c1.value == c2.value) && (c1.color == c2.color);
}

enum cname {SINGLE = 1, PAIR = 2, FLASH = 3, STREET = 4, THREE = 5, STREETFLASH = 6, MAJOR = 7};
struct Combination
{
    cname Name;
    int val;
    Combination() {}
    Combination(Card *cds)
    {
        sort(cds, cds + 3);
        if((cds[0].value == cds[1].value) && (cds[1].value == cds[2].value))
        {
            if(cds[0].value == 3)
                Name = MAJOR;
            else
            {
                Name = THREE;
                val = cds[0].value;
            }
            return;
        }
        if((cds[0].color == cds[1].color) && (cds[1].color == cds[2].color))
        {
            if((cds[0].value + 1 == cds[1].value) && (cds[0].value + 2 == cds[2].value))
            {
                Name = STREETFLASH;
                val = cds[2].value;
            }
            else
            {
                Name = FLASH;
                val = 10000 * cds[2].value + 100 * cds[1].value + cds[0].value;
            }
            return;
        }
        if((cds[0].value + 1 == cds[1].value) && (cds[0].value + 2 == cds[2].value))
        {
            Name = STREET;
            val = cds[2].value;
            return;
        }
        if(cds[1].value == cds[2].value)
        {
            Name = PAIR;
            val = 100 * cds[1].value + cds[0].value;
            return;
        }
        if(cds[1].value == cds[0].value)
        {
            Name = PAIR;
            val = 100 * cds[1].value + cds[2].value;
            return;
        }
        Name = SINGLE;
        val = 10000 * cds[2].value + 100 * cds[1].value + cds[0].value;
    }
};

bool operator<(Combination c1, Combination c2)
{
    if((int)c1.Name == (int)c2.Name)
    {
        return c1.val < c2.val;
    }
    return (int)c1.Name < (int)c2.Name;
}

bool operator==(Combination c1, Combination c2)
{
    return (c1.Name == c2.Name) && (c1.val == c2.val);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    Card Sasha[3], Dima[5];
    char Winner[3][10] = {"Sasha", "Artyom", "Dima"};
    int dc;
    while(1)
    {
        dc = 3;
        for(int i = 0; i < 3; ++i)
            Sasha[i].in();
        for(int i = 0; i < 3; ++i)
            Dima[i].in();
        dc = 3;
        for(int i = 0; i < 2; ++i)
        {
            Card cheat;
            if(cheat.in() == false)
                return 0;
            bool ok = true;
            for(int k = 0; k < 3; ++k)
            {
                if(cheat == Dima[k] || cheat == Sasha[k])
                {
                    ok = false;
                    break;
                }
            }
            if(cheat == Dima[dc - 1])
                ok = false;
            if(ok)
                Dima[dc++] = cheat;
        }
        Combination SComb(Sasha);
        Combination DComb;
        int res = 0;
        Card comb[3];
        for(int i = 0; i < dc - 2; ++i)
        {
            comb[0] = Dima[i];
            for(int j = i + 1; j < dc - 1; ++j)
            {
                comb[1] = Dima[j];
                for(int k = j + 1; k < dc; ++k)
                {
                    comb[2] = Dima[k];
                    DComb = Combination(comb);
                    if(SComb < DComb)
                        res = 2;
                    else if(DComb == SComb)
                        res = max(res, 1);
                }
            }
        }
        puts(Winner[res]);
    }
   //    return 0;
}