亚马逊 在线笔试 2014-10-9 比较扑克牌序列

139 篇文章 2 订阅
25 篇文章 0 订阅

第一题:巨麻烦的一道题目,大意是比较扑克牌序列,每个序列四张牌

 

规则一:四张牌相同。自然数字大的胜出,比如3,3,3,3 < 6,6,6,6

规则二:四张牌连续。当然序列最大的那个胜出。但是有个小trick,A在这里默认表最大牌,但是如果后接2,3,4,则A表最小牌,为了获得连续序列

比如A,2,3,4 < J,Q,K,A

规则三:有三张相同。以每个序列相同牌较大的胜出。

比如3,3,3,2>2,2,2,A

规则四: 两个对子。当然以对子较大的胜出,最大的对子相同,则以次大的对子较大者胜出。

比如4,4,3,3 > 4,2,4,2

规则五:一个对子。对子较大者胜出,如果对子相同,则比较剩下较大牌,如果还相同,比较次大牌

3,3,7,4 < 3,3,7,5

规则六:如果以上皆不满足,则按照大牌>小牌比较(即从最大牌开始比较,分出高下为止)

 

如果两个序列不属于同一规则,则规则小者胜出。

如果序列一大于序列二,输出1,反之输出-1;如果序列相同,输出0。

如果发现作弊,即两副牌中某张牌数量超过5张,则输出-2。

 

OK,以上是题目描述。这个题目,个人感觉主要是读懂题意,实现起来确实也非常麻烦,但是没啥难点,但是也会搞很久。

主要是几点:

1、解析输入字符串(如果你用C、C++,会比较蛋疼)

2、适配规则逻辑(更像状态机)

3,比较逻辑

好像也没啥是吧,但是本屌丝做了N久才把Case全过。而且代码巨长,200+行,准备吃饭去了,代码稍后奉上。

昨晚有事。现在奉上我水的不忍直视的代码。

复制代码
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int change(char a)
{
    switch (a)
    {
    case 'A':
        return 14;
        break;
    case 'J':
        return 11;
        break;
    case 'Q':
        return 12;
        break;
    case 'K':
        return 13;
        break;
    default:
        return 0;
        break;
    }
}

int istype(int *a)
{
    int x = a[0];
    int ans = 1;
    int hash[15];
    memset(hash, 0, sizeof(hash));
    for (int i = 0; i < 4; i++)
    {
        hash[a[i]]++;
    }
    int eq = 1;
    int deq = 0;
    for (int i = 1; i < 15; i++)
    {
        if (hash[i] == 4)
            return 1;
        if (hash[i] == 3)
            return 3;
        if (i>1)
        {
            if (hash[i] == hash[i - 1]&&hash[i]==1)
            {
                eq++;
            }
        }

        if (eq == 4)
            return 2;

        if (hash[i] == 2)
            deq++;
        if (deq == 2)
            return 4;


    }
    if (deq == 1)
        return 5;
    if (eq == 3 && hash[2] == hash[3] && hash[3] == hash[4] &&hash[2]==1 ){
        if (a[3] == 14){
            a[3] = 1;
            sort(a, a + 4);
            return 2;
        }
    }
    return 6;
}

int cmp(int *a, int *b, int kind)
{
    if (kind == 3)
    {
        int h1[15], h2[15];
        memset(h1, 0, sizeof(h1));
        memset(h2, 0, sizeof(h2));
        int c1, c2;
        for (int i = 0; i<4; i++)
        {
            h1[a[i]]++;
            if (h1[a[i]] == 3)
                c1 = a[i];
        }
        for (int i = 0; i<4; i++)
        {
            h2[b[i]]++;
            if (h2[a[i]] == 3)
                c2 = a[i];
        }
        if (c1>c2)
            return 1;
        if (c1<c2)
            return -1;

    }
    if (kind == 4)
    {
        int h1[15], h2[15];
        memset(h1, 0, sizeof(h1));
        memset(h2, 0, sizeof(h2));
        int c1, c2;
        for (int i = 0; i<4; i++)
        {
            h1[a[i]]++;
            if (h1[a[i]] == 2)
                c1 = a[i];
        }
        for (int i = 0; i<4; i++)
        {
            h2[b[i]]++;
            if (h2[a[i]] == 2)
                c2 = a[i];
        }
        if (c1>c2)
            return 1;
        if (c1<c2)
            return -1;
    }
    for (int i = 3; i >=0; i--)
    {
        if (a[i] > b[i])
            return 1;
        else if (a[i] < b[i])
            return -1;
    }
    return 0;
}

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    string a, b;
    int aa[4], bb[4];
    int hash[15];
    while (cin >> a >> b)
    {
        int ans = 0;
        int idx = 0;
        for (int i = 0; i < a.size(); i++)
        {
            int sum = 0;
            if (a[i] >= '2'&&a[i] <= '9')
            {
                sum = a[i] - '0';
                aa[idx++] = sum;
            }
            else if (a[i] == '1')
            {
                sum = 10;
                aa[idx++] = sum;
                i++;
            }
            else if (a[i] == ',')
            {
                continue;
            }
            else{
                sum = change(a[i]);
                aa[idx++] = sum;
            }

        }
        idx = 0;
        for (int i = 0; i < b.size(); i++)
        {
            int sum = 0;
            if (b[i] >= '2'&&b[i] <= '9')
            {
                sum = b[i] - '0';
                bb[idx++] = sum;
            }
            else if (b[i] == '1')
            {
                sum = 10;
                bb[idx++] = sum;
                i++;
            }
            else if (b[i] == ',')
            {
                continue;
            }
            else{
                sum = change(b[i]);
                bb[idx++] = sum;
            }
        }

        memset(hash, 0, sizeof(hash));
        for (int i = 0; i < 4; i++)
        {

            hash[aa[i]]++;
            hash[bb[i]]++;
            if (hash[aa[i]] > 4 || hash[bb[i]] > 4)
            {
                ans = -2;
                break;
            }

        }
        if (ans == -2)
        {
            cout << ans << endl;
            continue;
        }
        std::sort(aa, aa + 4);
        std::sort(bb, bb + 4);


        int ka = istype(aa);
        int kb = istype(bb);

        //for (int i = 0; i < 4; i++)
        //    cout << aa[i] << " ";
        //cout << endl;
        //for (int i = 0; i < 4; i++)
        //    cout << bb[i] << " ";
        //cout << endl;

        //cout << ka << " " << kb << endl;
        if (ka == kb)
        {
            ans = cmp(aa, bb,ka);
        }
        else{
            if (ka < kb)
                ans = 1;
            else
                ans = -1;
        }
        cout << ans << endl;
    }
    return 0;
}
复制代码

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值