设一副包含点数A到K,四种花色的52张牌,将三张及以上同点数不同花色的牌组或者三张
时间: 2023-10-04 07:04:54 浏览: 62
这是一道斗地主牌型的问题。如果一副牌中存在三张及以上同点数不同花色的牌组或者三张及以上的顺子,则称之为“炸弹”或“飞机”(包括三带一、三带二等)。现在我们需要在一副包含点数A到K、四种花色的52张牌中找出所有的炸弹和飞机。
我们可以将每张牌表示为一个数字和一个字符的组合,例如“红桃A”可以表示为“1H”,“方块5”可以表示为“5D”,其中数字1到13分别对应点数A到K,字符H、D、S、C分别对应红桃、方块、黑桃、草花四种花色。
接下来,我们可以使用一个哈希表来统计每个点数出现的次数。具体的做法是,遍历牌组中的每张牌,将该牌点数出现的次数加1,最后得到一个点数计数的哈希表。然后,我们可以遍历哈希表中的每个元素,找出点数计数大于等于3的元素,这些元素就是所有的炸弹。
对于飞机,我们需要遍历哈希表中点数计数大于等于3的元素,对于每个点数,我们可以在牌组中找出所有点数相邻的牌,例如如果有3个“3”和4个“4”,则可以组成一个3-4的顺子。如果顺子中包含了3张及以上的牌,则可以将其视为一个飞机。
以下是C++代码实现:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
string get_card(int num, char suit) {
string res;
if (num == 1) res += "A";
else if (num == 10) res += "T";
else if (num == 11) res += "J";
else if (num == 12) res += "Q";
else if (num == 13) res += "K";
else res += to_string(num);
res += suit;
return res;
}
vector<vector<string>> find_bombs_and_planes(const vector<string>& cards) {
unordered_map<int, int> counts;
for (const auto& card : cards) {
int num = stoi(card.substr(0, card.size() - 1));
counts[num]++;
}
vector<vector<string>> res;
for (const auto& [num, count] : counts) {
if (count >= 3) {
vector<string> bomb(count, get_card(num, 'X'));
res.push_back(bomb);
}
if (count >= 3) {
vector<string> plane;
for (int i = num; i < num + count; i++) {
string card = get_card(i, 'X');
auto it = find(cards.begin(), cards.end(), card);
if (it == cards.end()) break;
plane.push_back(*it);
}
if (plane.size() >= 3) res.push_back(plane);
}
}
return res;
}
int main() {
vector<string> cards = {
"2H", "2D", "2S", "3H", "3D", "3S", "4H", "4D", "4S", "5H", "5D", "5S",
"6H", "6D", "6S", "7H", "7D", "7S", "8H", "8D", "8S", "9H", "9D", "9S",
"TH", "TD", "TS", "JH", "JD", "JS", "QH", "QD", "QS", "KH", "KD", "KS",
"AH", "AD", "AS"
};
auto res = find_bombs_and_planes(cards);
for (const auto& group : res) {
for (const auto& card : group) {
cout << card << " ";
}
cout << endl;
}
return 0;
}
```
这段代码中,我们定义了一个 `get_card` 函数,用于将数字和花色组合成一张牌。然后,我们使用一个哈希表 `counts` 统计每个点数出现的次数。接下来,我们遍历哈希表中的每个元素,找出点数计数大于等于3的元素,这些元素就是所有的炸弹。对于飞机,我们需要遍历哈希表中点数计数大于等于3的元素,对于每个点数,我们在牌组中找出所有点数相邻的牌,如果顺子中包含了3张及以上的牌,则可以将其视为一个飞机。最后,我们将所有的炸弹和飞机组成的牌组返回。