题目描述
聪聪和明明两位小朋友正在玩一个扑克牌游戏。每一副扑克牌有黑桃、红桃、草花、方块四种花色,每种花色有 13 张牌,牌值分别是 Ace、2、3、4、5、6、7、8、9、10、Jack、Queen、King,如下图所示:
每一轮出牌,聪聪首先拿出一张牌,然后明明也拿出一张牌,当明明拿出的牌与聪聪拿 出的牌花色相同且牌值比聪聪的大时,明明才能获得本轮出牌的胜利,否则聪聪胜利。这里 我们假定牌值的大小关系为:
2<3<4<5<6<7<8<9<10<Jack<Queen<King<Ace
请编程计算某一轮出牌中,当聪聪拿出一张牌后,明明有多少种出牌方案可以获得胜利,并输出牌值最小的出牌方案。
输入
输入共 N+2 行。(1≤N≤100)
第 1 行是表示聪聪的出牌信息,首先是一个代表花色的小写字母,然后是一个代表牌值 的整数,中间用一个空格分隔。
第 2 行一个整数 N(1≤N≤100),表示明明现在手上牌的数量。
接下来 N 行,每行表示明明手中一张牌的信息,首先是一个代表花色的小写字母,然后是一个代表牌值的整数,中间用一个空格分隔。注意,他们玩的游戏有多副牌,所以有些牌可能重复。
说明:表示花色的小写字母为“s”、“h”、“c”、“d”,分别表示黑桃、红桃、草花、方 块。表示牌值的整数为 1 到 13,其中 1 表示 Ace,11 表示 Jack,12 表示 Queen,13 表示 King。
输出
输出共 2 行。
第 1 行输出明明要想获得胜利有多少种出牌方案。花色和牌值都相同的出牌方案算作 一种。如果明明没有可以获胜的出牌方案,则输出“0”,此时第 2 行不需要输出。
第 2 行输出明明要想获得胜利可以出的牌中牌值最小的那张牌的信息,包括牌的花色和牌值,中间用一个空格分隔。花色用小写字母“s”、“h”、“c”、“d”分别表示黑桃、红桃、草花、方块,牌值用 Ace、2、3、4、5、6、7、8、9、10、Jack、Queen、King 分别表示 1到 13。
样例输入 Copy
h 11
4
c 1
h 12
h 10
s 12
样例输出 Copy
1
h Queen
提示
聪聪本轮出的牌位为红心Jack。明明有4张牌,分别为草花Ace,红心Queen,红心10和黑桃Queen。明明要想获得胜利,出的牌花色必须和聪聪相同且牌值比聪聪的大,所以只有1种出牌方案,为红心Queen。
题意
按照题目讲述模拟扑克牌的出牌
分析
本题的两个点在于:1.求出现有的n张牌的总分数;2.求出13种牌中分数最大为多少,再乘上m,加到总和里。
本题的一个难点在于牌的信息与牌的分数匹配。信息是以字符串的形式输入,要分情况判断。特别要注意“A”、“10”、“J”、“Q”、“K” 这 5 种点数的牌。
分析点1:
由牌值信息可知Ace牌最大,Ace是用1来表示的,在正常的大小顺序中这是最小的数,所以在比较大小时,可以将Ace的值设为14,这样就能进行题意中的大小比较。
分析点2:
当聪聪的拿到的牌为Ace时,没有比聪聪同花色且更大牌了,此时直接输出0即可。
分析点3:
注意题目中要求输出的是最小的出牌方案,而不是可以出牌的张数。所以要设置一个数组来进行标记这种方案的牌是否已经使用了。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100 + 10;
int n;
char c;
int num;
int res;
bool st[N];
// 比较函数
bool check(char x,int y){
if(x != c) return false; // 若花色不同,则无法获胜
if(num == 1) return false; // 若对方为最大的Ace,则无法获胜
return y > num;
}
int main(){
ios::sync_with_stdio;
cin.tie(0),cout.tie(0);
cin >> c >> num >> n;
int mn = 20;
while(n--){
char tmp1;
int tmp2;
cin >> tmp1 >> tmp2;
if(tmp2 == 1) tmp2 = 14; // 将Ace设置为14
if(!st[tmp2]){
if(check(tmp1,tmp2)){
res++;
mn = min(mn,tmp2); // 统计最小的获胜方案
st[tmp2] = true;
}
}
}
//若没有获胜方案,则输出0,且第2行不需要输出,直接结束程序即可
if(res == 0){
cout << 0;
return 0;
}
cout << res << endl << c << ' ';
if(mn == 14) cout << "Ace";
else if(mn == 11) cout << "Jack";
else if(mn == 12) cout << "Queen";
else if(mn == 13) cout << "King";
else cout << mn;
return 0;
}