题目描述(时间限制: 1Sec 内存限制: 128MB) |
---|
玩家1和玩家2各出一张牌,看谁大。如果两张牌都不是王牌花色或则都是王牌花色,则牌面大的牌大,如果牌面一样大则一样大。若其中一张牌是王牌而另一张不是,则无论牌面如何都是王牌花色大。 |
输入 |
第一行一个数字n,代表数据组数(n <= 10)。对于每组数据,首先输入一个字符(S\H\D\C),表示王牌花色。接下去一行有两张牌面,表示为牌面花色,如8D、9S等。 |
输出 |
对于每组数据,输出第一张牌是否比第二张牌大,若是则输出YES,否则输出NO |
样例输入 |
1 H QH 9S |
样例输出 |
YES |
分析:
题目不难理解,但对于点数的比较要注意思考(基于ASCII码)的是以下几点:
- J、Q、K三者在扑克牌中的关系不同于在ASCII表中;
- 表中虽有整体上的 数字(‘1’为49)<大写字母(‘A’为65)<小写字母(‘a’为97),但Ace在扑克牌中为最小点数;
- 由于要无间隔输入牌的点数和花色,可以用字符数组来存储,但对于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