一副扑克牌中有 1313 种不同点数的牌,我们用 A,2,3,4,5,6,7,8,9,T,J,Q,K
分别表示点数 11 到 1313。每种点数都有四张不同花色的牌,我们用 S,H,C,D
分别表示四种不同的花色。
蜗蜗发明了一种名为 蜗蜗牌
的牌型:若三张扑克牌的花色均不相同,且它们的点数之和为质数,则称这三张牌的组合为一个 蜗蜗牌
。
现从两副扑克牌(共 104104 张)中取出 nn 张牌,它们的编号分别为 1,2,...,n1,2,...,n,蜗蜗想知道从这 nn 张牌中取出三张牌能组成一个 蜗蜗牌
的方案有多少种。取的三张牌的编号集合不同即视为不同的方案。
输入格式
第一行输入一个整数 nn,表示有多少张牌。
接下来 nn 行,每行输入两个字符,表示一张牌。第一个字符是 S,H,C,D
中的一个,表示牌的花色。第二个字符是 A,2,3,4,5,6,7,8,9,T,J,Q,K
中的一个,表示牌的点数。
输出格式
输出一个整数,表示有多少种方案。
样例输入1
4
SA
SA
H9
CK
样例输出1
2
样例输入2
10
C5
H2
CQ
ST
DQ
S6
D4
D6
S8
D5
样例输出2
14
数据范围
对于 100%100% 的数据,保证 3≤n≤1043≤n≤104。
#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
// 判断一个数是否为质数
bool isPrime(int num) {
if (num < 2) return false;
for (int i = 2; i * i <= num; ++i) {
if (num % i == 0) return false;
}
return true;
}
int main() {
int n;
cin >> n; // 输入牌的数量
vector<pair<char, char>> cards(n); // 存储牌的花色和点数
for (int i = 0; i < n; ++i) {
cin >> cards[i].first >> cards[i].second; // 输入每张牌
}
int count = 0; // 计数符合条件的组合
// 三重循环生成所有组合
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
// 确保花色不同
if (cards[i].first != cards[j].first &&
cards[i].first != cards[k].first &&
cards[j].first != cards[k].first) {
// 计算点数之和
int sum = 0;
sum += (cards[i].second == 'A') ? 1 :
(cards[i].second == 'T') ? 10 :
(cards[i].second == 'J') ? 11 :
(cards[i].second == 'Q') ? 12 :
(cards[i].second == 'K') ? 13 :
(cards[i].second - '0');
sum += (cards[j].second == 'A') ? 1 :
(cards[j].second == 'T') ? 10 :
(cards[j].second == 'J') ? 11 :
(cards[j].second == 'Q') ? 12 :
(cards[j].second == 'K') ? 13 :
(cards[j].second - '0');
sum += (cards[k].second == 'A') ? 1 :
(cards[k].second == 'T') ? 10 :
(cards[k].second == 'J') ? 11 :
(cards[k].second == 'Q') ? 12 :
(cards[k].second == 'K') ? 13 :
(cards[k].second - '0');
// 检查点数之和是否为质数
if (isPrime(sum)) {
count++; // 计数加一
}
}
}
}
}
cout << count << endl; // 输出符合条件的组合数量
return 0;
}