测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25126. 21 点游戏

填空题 容易

题目描述

21 点游戏

题目描述:

在 21 点游戏中,玩家的目标是使手中牌的点数总和尽可能接近21点,但不能超过 21 点。游戏采用一副去除大小王的扑克牌,其中包含 13 种牌面(A、2、3、4、5、6、7、8、9、10、J、Q、K),每种牌面有 4 张。牌的点数定义如下:

1)A 可以代表 1 点或 11 点;

2)J、Q、K 均代表 10 点;

3)牌面 2~10 代表的点数与其牌面相同(例如:2 代表 2 点,3 代表 3 点,以此类推)。

给定一个字符串 S,表示你手中的牌。请将这些牌的点数累加(如果手中的牌有 A,你可以单独调整其中每一个 A 的点数),并计算在不超过 21 点的情况下,S 的总点数的最大值;如果无论怎么计算都大于 21点,则输出 0。

注:牌面 10 会占用 2 个字符位,其余牌面各占用 1 个字符位。

例 1: S = "A3A4";S 的总点数的最大值是 19(其中一个 "A" 代表 1 点,另一个 "A" 代表 11 点),

即 1 + 3 + 11 + 4。

例 2:S = "A10J";S 的总点数的最大值是 21("A" 代表 1 点,中间的 "10" 代表 10 点,"J" 也代表 10 点),即 1 + 10 + 10。

例 3:S = "AJQK";无论 "A" 代表 1 点还是 11 点,S 的总点数都大于 21,故输出 0。

输入描述:

输入一个仅包含 13 种牌面的字符串 S(2≤S 的长度≤11),其中相同的牌不会超过 4 张。

输出描述:

输出一个整数,表示 S 的总点数的最大值,如果无论怎么计算都大于 21 点,则输出 0。

样例输入:

A3A4

样例输出:

19

参考答案

#include <iostream> #include <string> #include <vector> using namespace std; int main() { string s; cin >> s; int base = 0, countA = 0; // 遍历字符串计算非A牌的点数 for (int i = 0; i < s.length();) { if (s[i] == 'A') { countA++; i++; } else if (s[i] == '1' && i + 1 < s.length() && s[i + 1] == '0') { base += 10; i += 2; // 跳过两个字符 } else { if (s[i] == 'J' || s[i] == 'Q' || s[i] == 'K') { base += 10; } else { base += s[i] - '0'; } i++; } } // 处理A牌的灵活点数 int maxTotal = 0; bool valid = false; for (int k = countA; k >= 0; --k) { int total = base + 11 * k + (countA - k); // k个A算11点,其余算1点 if (total <= 21) { maxTotal = max(maxTotal, total); valid = true; } } cout << (valid ? maxTotal : 0) << endl; return 0; }

答案解析

非A牌:直接计算固定点数(10/J/Q/K=10,其他按牌面)

A牌:枚举11点A的数量(从最多逐步减少)

总点数 = 非A点数 + 11×k + 1×(A总数-k)

若所有组合都超21点则输出0

上一题 下一题