从若干副扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13;而大、小王为0,可以看成任意牌。另外,"10,J(11),Q(12),K(13),A(1)"也是顺子。
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
bool isStraight(std::vector<int>& nums) {
std::set<int> uniqueCards; // 用于存储唯一的牌值
// 情况1的最小值和最大值 情况2的最小值和最大值(用于A作为14的情况)
int minVal, maxVal,SecondMaxVal=14,SecondMinVal=0;
int wildcards = 0; // 计数大小王数量
// 将牌值填入集合中,同时统计大小王的数量
for (int num : nums) {
if (num == 0) { // 若为大小王则统计
wildcards++;
}
else {
uniqueCards.insert(num);
}
}
// 若大小王数量为 5,则可以组成顺子
if(wildcards==5) return true;
//计算最大值和最小值
minVal = *uniqueCards.begin();
maxVal = *uniqueCards.rbegin();
// 若存在A且A不是唯一牌,则将A作为14的情况 需要求新的最小值
if(uniqueCards.find(1)!= uniqueCards.end()&&uniqueCards.size()>1)
SecondMinVal =*(++uniqueCards.begin());
// 如果唯一牌数量+大小王数量小于 5,则不可能形成顺子
if (uniqueCards.size() + wildcards < 5) {
return false;
}
// 如果最大值与最小值的差值超过 5,则不可能形成顺子(并考虑A作为14的情况)
return (maxVal - minVal < 5||SecondMaxVal-SecondMinVal<5);
}
int main() {
std::vector<int> cards = {0, 0, 0, 1, 13}; // 例子牌值
if (isStraight(cards)) {
std::cout << "这5张牌可以组成顺子。" << std::endl;
} else {
std::cout << "这5张牌不能组成顺子。" << std::endl;
}
return 0;
}