王牌花色(shape of my heart)

题目描述(时间限制: 1Sec 内存限制: 128MB)
玩家1和玩家2各出一张牌,看谁大。如果两张牌都不是王牌花色或则都是王牌花色,则牌面大的牌大,如果牌面一样大则一样大。若其中一张牌是王牌而另一张不是,则无论牌面如何都是王牌花色大。
输入
第一行一个数字n,代表数据组数(n <= 10)。对于每组数据,首先输入一个字符(S\H\D\C),表示王牌花色。接下去一行有两张牌面,表示为牌面花色,如8D、9S等。
输出
对于每组数据,输出第一张牌是否比第二张牌大,若是则输出YES,否则输出NO
样例输入
1
H
QH 9S
样例输出
YES

分析:
题目不难理解,但对于点数的比较要注意思考(基于ASCII码)的是以下几点:

  1. J、Q、K三者在扑克牌中的关系不同于在ASCII表中;
  2. 表中虽有整体上的 数字(‘1’为49)<大写字母(‘A’为65)<小写字母(‘a’为97),但Ace在扑克牌中为最小点数;
  3. 由于要无间隔输入牌的点数和花色,可以用字符数组来存储,但对于10X(X为任意花色),又该如何与其他牌的点数相比较呢?

完整代码如下:

#include <stdio.h>
#include <string.h>
int point(char p[])    //对于不同的点数情况,分别一一讨论
{
    int len=strlen(p);
    int n;
    if(len==2)
    {
        if(p[0]=='A')
            n=1;
        else if(p[0]>='2'&&p[0]<='9')
            n=(int)(p[0]-48);   //与减'0'相同
        else if(p[0]=='J')
            n=11;
        else if(p[0]=='Q')
            n=12;
        else if(p[0]=='K')
            n=13;
    }
    else if(len==3)   //即对于点数为10的情况
        n=10;
    return n;
}
int main()
{
    char a[4],b[4];
    char nowcolor;
    int n,leftlen,rightlen;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        getchar();    //第一次吸收的是来自循环外scanf n的回车,之后吸收的是前一次次循环输入末的回车。
        nowcolor=getchar();
        scanf("%s%s",a,b);
        leftlen=strlen(a);
        rightlen=strlen(b);
        //下面开始确认花色
        if(a[leftlen-1]==nowcolor&&b[rightlen-1]!=nowcolor)  
        //由于存在点数为10的情况,故需要用字符串长度-1来进行不同点数的花色确定
            printf("YES\n");
        else if(a[leftlen-1]!=nowcolor&&b[rightlen-1]==nowcolor)
            printf("NO\n");
        else         //抛开上述仅某一张为王牌花色的情况,仅剩同是或同不是
        {
            if(point(a)>point(b))
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}

在解决了点数比较的问题之后,这道题的琐碎却不容忽视的问题就在编写代码上了,比如循环中用getchar来吸收回车,稍不注意就成了隐形的炸弹。

PS:
看到S\H\D\C就想到了下面的歌词:

I know that the spades are the swords of a soldier
I know that the clubs are weapons of war
I know that diamonds mean money for this art
But that's not the shape of my heart
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值