poj 2200 A Card Trick(模拟)

http://poj.org/problem?id=2200

简单模拟。比赛时没找到队友的错误,取余的时候没特判。应该A的。可惜那。。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

char card[5][10];
struct node
{
    char s[10];
}st[5];

int cal(char s[])
{
    if(strlen(s) == 3)
        return 10;
    if(s[0] >= '2' && s[0] <= '9')
        return s[0]-'0';
    if(s[0] == 'A')
        return 1;
    if(s[0] == 'J')
        return 11;
    if(s[0] == 'Q')
        return 12;
    if(s[0] == 'K')
        return 13;
}

int cmp(struct node t1, struct node t2)
{
    int a1 = cal(t1.s);
    int a2 = cal(t2.s);
    if(a1 == a2)
        return t1.s[strlen(t1.s)-1] < t2.s[strlen(t2.s)-1];
    return a1 < a2;
}

void solve()
{
    int i,j;
    for( i = 0; i < 5; i++)
    {
        for( j = 0; j < 5; j++)
        {
            if(i != j && card[i][strlen(card[i])-1] == card[j][strlen(card[j])-1] )
            {
                int cnt = 0;
                for(int k = 0; k < 5; k++)
                {
                    if(k != i && k != j)
                        strcpy(st[cnt++].s, card[k]);
                }

                sort(st,st+cnt,cmp);

                int a1 = cal(card[i]);
                int a2 = cal(card[j]);
                if( a1 == (a2+1)%13 || (a1 == 13&&a2 == 12) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[0].s,st[1].s,st[2].s);
                    break;
                }

                else if(a1 == (a2+2)%13 || (a1 == 13 && a2 == 11) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[1].s,st[0].s,st[2].s);
                    break;
                }

                else if(a1 == (a2+3)%13 || (a1 == 13 && a2 == 10) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[1].s,st[2].s,st[0].s);
                    break;
                }
                else if(a1 == (a2+4)%13 || (a1 == 13 && a2 == 9) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[0].s,st[2].s,st[1].s);
                    break;
                }
                else if(a1 == (a2+5)%13 || (a1 == 13 && a2 == 8) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[2].s,st[0].s,st[1].s);
                    break;
                }
                else if(a1 == (a2+6)%13 || (a1 == 13 && a2 == 7) )
                {
                    printf("%s %s %s %s %s\n",card[i],card[j],st[2].s,st[1].s,st[0].s);
                    break;
                }
            }
        }
        if(j < 5) break;
    }
}

int main()
{
    int test;
    scanf("%d",&test);
    int item = 1;
    while(test--)
    {
        for(int i = 0; i < 5; i++)
            scanf("%s",card[i]);
        printf("Problem %d: ",item++);
        solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值