(BOSS)Poker time! (20 xp)

“千里春风不识路,万仞山顶自相逢”

当当当!小橘归来,继续解题!

题目描述

背景:两个人每人发3张牌(各从一副牌中),每张牌包括花色(红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club))和大小(从小到大依次是:2-10、J、Q、K、A),谁手上有最大的一张或多张(如果有相同的牌)牌谁获胜。

输入:A的3张牌(未排序)和B的3张牌(未排序)。(参见用例)

输出:A的3张牌的排序后的输出和B的3张牌的排序后的输出,以及A和B谁获胜。(参见用例)

解题思路

本题乍一看考排序,再定睛一看,哦,原来是有优先级的排序(花色和大小)。诶那感觉也不是很困难嘿嘿,结果真写起来就被啪啪打脸:)

经小橘不严谨的总结,认为本题的难点主要有三个,一是对于输入输出时的细节处理,二是对花色和大小的权重赋值处理,三是对'10'的单独处理

整体思路是先对牌的花色和大小分别进行赋值,然后想办法将这两个属性整合到一个数中用于比较,比较的过程中完成A、B的降序排序,最终输出结果。即:赋值——>整合——>比较——>输出。

关键参数

A[3][3],B[3][3]:3×3的二维数组,用于储存输入的三张牌,列为3是由于10的存在,得多留一位。

A_score[3][2],B_score[3][2]:对于每个花色和大小进行重新赋值,方便后续整合比较。花色的优先级高,故将其设为百位数。

A_sum[3],B_sum[3]:是对花色和大小整合后的数值,是比较和排序的依据。

难点分析

下面咱们对难点逐一进行分析:

1、输入输出时的细节处理

输入中只有10是特殊的,所以我们希望能将所有的输入都转变成两位的形式,这样方便后续的处理和比较。

注意:输入中无10,第三位为空格;若有10,则将第二位转变为'9'+1,第三位转变为0,并补上空格。

for(i=0;i<3;i++)
    {
        scanf("%c%c%c",&A[i][0],&A[i][1],&A[i][2]);
        if(A[i][1]=='1'&&A[i][2]=='0')
        {
            A[i][1]='9'+1;
            A[i][2]=0;
            if(i!=2)
                scanf(" ");
        }
    }
    scanf("\n");
    for(i=0;i<3;i++)
    {
        scanf("%c%c%c",&B[i][0],&B[i][1],&B[i][2]);
        if(B[i][1]=='1'&&B[i][2]=='0')
        {
            B[i][1]='9'+1;
            B[i][2]=0;
            if(i!=2)
                scanf(" ");
        }
    }

输出时要对第一步处理进行还原,将'9'+1还原为'10'

for(i=0;i<3;i++)
    {
        if(A[i][1]=='9'+1)
        {
            A[i][1]='1';
            A[i][2]='0';
        }
        if(B[i][1]=='9'+1)
        {
            B[i][1]='1';
            B[i][2]='0';
        }
    }
    
//输出结果
    printf("A:"); 
    for(i=0;i<3;i++)
    {
        if(A[i][2]=='0')
            printf(" %c%c%c",A[i][0],A[i][1],A[i][2]);
        else
            printf(" %c%c",A[i][0],A[i][1]);
    }
    printf("\n");
    printf("B:");
    for(i=0;i<3;i++)
    {
        if(B[i][2]=='0')
            printf(" %c%c%c",B[i][0],B[i][1],B[i][2]);
        else
            printf(" %c%c",B[i][0],B[i][1]);
    }
    printf("\n");

2、花色和大小的权重赋值处理

以A为例,对于花色和大小进行赋值。由于花色的优先级更高,故我们将花色权重设置到百位,这样对大小的赋值不会影响到花色。

A_sum,B_sum即代表整体的分数,后面可以直接拿这个作比较。

switch(A[i][0])
        {
            case 'H':
                A_score[i][0]=400;
                break;
            case 'S':
                A_score[i][0]=300;
                break;
            case 'D':
                A_score[i][0]=200;
                break;
            case 'C':
                A_score[i][0]=100;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        switch(A[i][1])
        {
            case '2':
                A_score[i][1]=1;
                break;
            case '3':
                A_score[i][1]=2;
                break;
            case '4':
                A_score[i][1]=3;
                break;
            case '5':
                A_score[i][1]=4;
                break;
            case '6':
                A_score[i][1]=5;
                break;
            case '7':
                A_score[i][1]=6;
                break;
            case '8':
                A_score[i][1]=7;
                break;
            case '9':
                A_score[i][1]=8;
                break;
            case '9'+1:
                A_score[i][1]=9;
                break;
            case 'J':
                A_score[i][1]=10;
                break;
            case 'Q':
                A_score[i][1]=11;
                break;
            case 'K':
                A_score[i][1]=12;
                break;
            case 'A':
                A_score[i][1]=13;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        A_sum[i]=A_score[i][0]+A_score[i][1];

3、对'10'的单独处理

这个前面都已提到,一个是在输入时将数组由三位转换为两位,输出时在转变回来,另一个则是要注意运算时位数的统一。

完整代码

#include<stdio.h>

int main()
{
//本题的难点主要有三个,一是对于花色和大小的赋值处理,二是对花色和大小的权重处理,三是对'10'的单独处理
    char A[3][3],B[3][3];
    int A_score[3][2],B_score[3][2],A_sum[3],B_sum[3];
    int i,j,temp;
    char ctemp1,ctemp2;

//输入中只有10是特殊的,所以我们希望能将所有的输入都转变成两位的形式,这样方便后续的处理和比较
//注意:输入中无10,第三位为空格;若有10,则将第二位转变为'9'+1,第三位转变为0,并补上空格
    for(i=0;i<3;i++)
    {
        scanf("%c%c%c",&A[i][0],&A[i][1],&A[i][2]);
        if(A[i][1]=='1'&&A[i][2]=='0')
        {
            A[i][1]='9'+1;
            A[i][2]=0;
            if(i!=2)
                scanf(" ");
        }
    }
    scanf("\n");
    for(i=0;i<3;i++)
    {
        scanf("%c%c%c",&B[i][0],&B[i][1],&B[i][2]);
        if(B[i][1]=='1'&&B[i][2]=='0')
        {
            B[i][1]='9'+1;
            B[i][2]=0;
            if(i!=2)
                scanf(" ");
        }
    }

//对于花色和大小进行赋值。由于花色的优先级更高,故我们将花色权重设置到百位,这样对大小的赋值不会影响到花色
//A_sum,B_sum即代表整体的分数,后面可以直接拿这个作比较
    for(i=0;i<3;i++)
    {
        switch(A[i][0])
        {
            case 'H':
                A_score[i][0]=400;
                break;
            case 'S':
                A_score[i][0]=300;
                break;
            case 'D':
                A_score[i][0]=200;
                break;
            case 'C':
                A_score[i][0]=100;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        switch(A[i][1])
        {
            case '2':
                A_score[i][1]=1;
                break;
            case '3':
                A_score[i][1]=2;
                break;
            case '4':
                A_score[i][1]=3;
                break;
            case '5':
                A_score[i][1]=4;
                break;
            case '6':
                A_score[i][1]=5;
                break;
            case '7':
                A_score[i][1]=6;
                break;
            case '8':
                A_score[i][1]=7;
                break;
            case '9':
                A_score[i][1]=8;
                break;
            case '9'+1:
                A_score[i][1]=9;
                break;
            case 'J':
                A_score[i][1]=10;
                break;
            case 'Q':
                A_score[i][1]=11;
                break;
            case 'K':
                A_score[i][1]=12;
                break;
            case 'A':
                A_score[i][1]=13;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        A_sum[i]=A_score[i][0]+A_score[i][1];

        switch(B[i][0])
        {
            case 'H':
                B_score[i][0]=400;
                break;
            case 'S':
                B_score[i][0]=300;
                break;
            case 'D':
                B_score[i][0]=200;
                break;
            case 'C':
                B_score[i][0]=100;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        switch(B[i][1])
        {
            case '2':
                B_score[i][1]=1;
                break;
            case '3':
                B_score[i][1]=2;
                break;
            case '4':
                B_score[i][1]=3;
                break;
            case '5':
                B_score[i][1]=4;
                break;
            case '6':
                B_score[i][1]=5;
                break;
            case '7':
                B_score[i][1]=6;
                break;
            case '8':
                B_score[i][1]=7;
                break;
            case '9':
                B_score[i][1]=8;
                break;
            case '9'+1:
                B_score[i][1]=9;
                break;
            case 'J':
                B_score[i][1]=10;
                break;
            case 'Q':
                B_score[i][1]=11;
                break;
            case 'K':
                B_score[i][1]=12;
                break;
            case 'A':
                B_score[i][1]=13;
                break;
            default:
                printf("Input Error!\n");
                return 0;
        }
        B_sum[i]=B_score[i][0]+B_score[i][1];
    }

//有了前面的铺垫,这里就是一个简单的冒泡排序,需要关注的就是对于数字和字符的分离但同步的处理
    for(i=0;i<2;i++)
    {
        if(A_sum[i]==A_sum[i+1]||B_sum[i]==B_sum[i+1])
        {
            printf("Input Error!\n");
            return 0;
        }
        for(j=0;j<2-i;j++)
        {
            if(A_sum[j]<A_sum[j+1])
            {
                temp=A_sum[j];
                A_sum[j]=A_sum[j+1];
                A_sum[j+1]=temp;
                
                ctemp1=A[j][0];
                ctemp2=A[j][1];
                A[j][0]=A[j+1][0];
                A[j][1]=A[j+1][1];
                A[j+1][0]=ctemp1;
                A[j+1][1]=ctemp2;
            }
            if(B_sum[j]<B_sum[j+1])
            {
                temp=B_sum[j];
                B_sum[j]=B_sum[j+1];
                B_sum[j+1]=temp;
                
                ctemp1=B[j][0];
                ctemp2=B[j][1];
                B[j][0]=B[j+1][0];
                B[j][1]=B[j+1][1];
                B[j+1][0]=ctemp1;
                B[j+1][1]=ctemp2;
            }
        }
        
    }

    if(A_sum[0]==B_sum[0])
    {
        if(A_sum[1]==B_sum[1])
        {
            if(A_sum[2]==B_sum[2])
            {
                printf("Winner is X!\n");
            }
            else if(A_sum[2]>B_sum[2])
            {
                printf("Winner is A!\n");
            }
            else
            {
                printf("Winner is B!\n");
            }
        }
        else if(A_sum[1]>B_sum[1])
        {
            printf("Winner is A!\n");
        }
        else
        {
            printf("Winner is B!\n");
        }
    }
    else if(A_sum[0]>B_sum[0])
    {
        printf("Winner is A!\n");
    }
    else if(A_sum[0]<B_sum[0])
    {
        printf("Winner is B!\n");
    }

//这一步也至关重要,是对第一步处理的还原,将'9'+1还原为'10'
    for(i=0;i<3;i++)
    {
        if(A[i][1]=='9'+1)
        {
            A[i][1]='1';
            A[i][2]='0';
        }
        if(B[i][1]=='9'+1)
        {
            B[i][1]='1';
            B[i][2]='0';
        }
    }
    
//输出结果
    printf("A:"); 
    for(i=0;i<3;i++)
    {
        if(A[i][2]=='0')
            printf(" %c%c%c",A[i][0],A[i][1],A[i][2]);
        else
            printf(" %c%c",A[i][0],A[i][1]);
    }
    printf("\n");
    printf("B:");
    for(i=0;i<3;i++)
    {
        if(B[i][2]=='0')
            printf(" %c%c%c",B[i][0],B[i][1],B[i][2]);
        else
            printf(" %c%c",B[i][0],B[i][1]);
    }
    printf("\n");
    return 0;
}

以上就是本次分享的全部内容啦,此题当然还有很多种解法,小橘也还在学习中,水平有限,如有考虑不周之处烦请各位不吝赐教:)

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值