列表

详情


OR44. 扑克牌大小

描述

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR

基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。

答案提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.

数据范围:保证输入合法

输入描述

输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。

输出描述

输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

示例1

输入:

4 4 4 4-joker JOKER

输出:

joker JOKER

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-08-14

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *infoCard(char *a)
{
    int *info = (int*)calloc(2, sizeof(int));
    if(*a == 'j'){
        info[0] = 6;
        return info;
    }
    switch(*a){
        case '1': info[1] = 10; break;
        case 'A': info[1] = 14; break;
        case '2': info[1] = 15; break;
        case 'J': info[1] = 11; break;
        case 'Q': info[1] = 12; break;
        case 'K': info[1] = 13; break;
        default: info[1] = *a-'0';
    }
    while(*a)
        if(*(a++) == ' ')
            ++info[0];
     
    ++info[0];
    return info;
}
int main(int argc, char const *argv[])
{
    char a[64], b[64];
    scanf("%[^-]-%[^\n]", a, b);
    int *ai = infoCard(a), *bi = infoCard(b);
    if(ai[0] == 6)
        printf("%s\n", a);
    else if(bi[0] == 6)
        printf("%s\n", b);
    else if(ai[0] == bi[0])
        printf("%s\n", ai[1] > bi[1] ? a : b);
    else if(ai[0] == 4)
            printf("%s\n", a);
        else if(bi[0] == 4)
        printf("%s\n", b);
        else
        printf("ERROR\n");
 
    free(ai);
    free(bi);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-14

#include <stdio.h>
#include <stdlib.h>
/**
    info[0]代表扑克牌的类型,info[1]代表同类型的大小
    info[0]=1代表单张,=2代表两张,=3代表三张,=4代表炸弹,=5代表顺子,=6代表王炸
*/
int *InfoCarf(char *a)
{
    int *info=(int *)calloc(2,sizeof(int));//calloc后内存空间数据初始化为0,返回大小为2的数组
    if(*a=='j')
    {
        info[0]=6;
        return info;
    }
    switch(*a)
    {
        case '1':info[1]=10;break;
        case 'J':info[1]=11;break;
        case 'Q':info[1]=12;break;
        case 'K':info[1]=13;break;
        case 'A':info[1]=14;break;
        case '2':info[1]=15;break;
        default: info[1]=*a-'0';
    }
    while(*a)
    {
        if(*(a++)==' ')//牌的张数等于空格数加一,若没有空格则为单张
            info[0]++;
    }
    info[0]++;
    return info;

}
int main()
{
    char a[64],b[64];//输入字符串前要给它分配空间
    scanf("%[^-]-%[^\n]",a,b);
    int *info1=InfoCarf(a);
    int *info2=InfoCarf(b);
    if(info1[0]==6)
        printf("%s\n",a);
    else if(info2[0]==6)
        printf("%s\n",b);
    else if(info1[0]==info2[0])
        printf("%s\n",info1[1]>info2[1]?a:b);
    else if(info1[0]==4)//炸弹可以跟其他类型比较
        printf("%s\n",a);
    else if(info2[0]==4)
        printf("%s\n",b);
    else
        printf("ERROR");
    return 0;
}

上一题